我得到了帶有列的資料:起點、終點、資料。
如果起點、終點行包含相同的資料(到兩個方向),我想合并它們并添加額外資料的另一列。
例如開始:
| 起點 | 端點 | 資料 |
|---|---|---|
| 一個 | 乙 | 1 |
| C | D | 2 |
| 乙 | 一個 | 3 |
| D | C | 4 |
到:
| 起點 | 端點 | 資料_1 | 資料_2 |
|---|---|---|---|
| 一個 | 乙 | 1 | 3 |
| C | D | 2 | 4 |
有沒有快速的方法在熊貓上做到這一點?
謝謝。
uj5u.com熱心網友回復:
首先,我們在一個索引上分組,我們在起點、終點對值進行排序,以確保我們獲得匹配排列
match_groups = ['_'.join(sorted(t)) for t in zip(df['startpoint'],df['endpoint'])]
df2 = df.groupby(match_groups, as_index = False).agg({'startpoint':'first', 'endpoint':'first', 'data':list})
df2 看起來像這樣:
startpoint endpoint data
-- ------------ ---------- ------
0 A B [1, 3]
1 C D [2, 4]
如果我們想要data在單獨的列中,那么我們apply pd.Series(并將列重命名為所需的標簽)
(df2.set_index(['startpoint', 'endpoint'])['data']
.apply(pd.Series).rename(columns = lambda n:f'data_{n 1}')
.reset_index()
)
輸出:
startpoint endpoint data_1 data_2
-- ------------ ---------- -------- --------
0 A B 1 3
1 C D 2 4
uj5u.com熱心網友回復:
如果我正確理解了您的問題,則以下代碼應該可以滿足您的要求-
data.index = [hash(frozenset([x,y])) for x, y in zip(data["startpoint"], data["endpoint"])]
result = data.groupby(data.index)["data"].apply(list).to_frame()
result = result["data"].apply(pd.Series)
result.columns = ["data1", "data2"]
result = pd.merge(data[["startpoint", "endpoint"]], result, left_index=True, right_index=True)
result = result[~result.index.duplicated(keep='first')]
變數data是原始資料幀。如果有任何不清楚的地方,請告訴我。
uj5u.com熱心網友回復:
你最好的選擇是使用 pd.merge()。Pandas 官網展示了如何使用 pd.merge() 函式。
https://pandas.pydata.org/docs/dev/user_guide/merging.html
uj5u.com熱心網友回復:
獲取起點和終點之間的匹配值,并為您的資料型別進行必要的轉換。然后,您可以對資料框中的值進行排序并使用groupby:
# Matching values between startpoint endpoint
df['start_end_grouped'] = [sorted(''.join(val).replace(',','')) for val in zip(df['startpoint'], df['endpoint'])]
# Conversions
df['data'] = df['data'].str.replace(',','').astype(float)
df['start_end_grouped'] = df['start_end_grouped'].astype(str)
# Result
df[['data','start_end_grouped']].sort_values(by=['start_end_grouped','data'])\
.groupby('start_end_grouped',as_index=False).agg(list)
start_end_grouped data
0 ['A', 'B'] [1.0, 3.0]
1 ['C', 'D'] [2.0, 4.0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420495.html
標籤:
