我有一個這樣的 df:
>>> df1
col_1 col_2 labels
0 aaa abc (71020,)
1 ddd ghi (99213, 99287,)
2 bbb cde (77085,)
3 eee ijk (99233, 71020, 36415,)
和另一個像這樣的df:
>>> df2
71020 77085 36415 99213 99287 99233 labels_mg
0 1 0 1 0 0 1 (99233, 71020, 36415,)
1 1 0 0 0 0 0 (71020,)
2 0 0 0 1 1 0 (99213, 99287)
3 0 1 0 0 0 0 (77085,)
并希望通過在 2 個 dfs 上方右連接來生成 df,如下所示:
col_1 col_2 labels 71020 77085 36415 99213 99287 99233
0 aaa abc (71020,) 1 0 0 0 0 0
1 ddd ghi (99213, 99287,) 0 0 0 1 1 0
2 bbb cde (77085,) 0 1 0 0 0 0
3 eee ijk (99233, 71020, 36415,) 1 0 1 0 0 1
這是我嘗試過的,但這會生成一個具有 0 行的空資料框,但具有所有列名稱。
pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])
元組在兩個 dfs 中都被決議為元組。ast.literal_eval從檔案讀取到pandas dfs后,我已經完成了這兩個df的列。兩個 dfs 也不共享公共索引。
我的 df 大小是 (528840, 207) 和 (528840, 5)。我如何有效地做到這一點?
uj5u.com熱心網友回復:
有一個問題,一個元組是整數,第二個是由字串填充的,解決方案是將它們轉換為整數,例如:
import ast
df1['labels'] = df1['labels'].apply(ast.literal_eval)
df2['labels_mg'] = df2['labels_mg'].apply(lambda x: tuple([int(y) for y in ast.literal_eval(x)]))
df = pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])
print (df)
col_1 col_2 labels 71020 77085 36415 99213 99287 \
0 aaa abc (71020,) 1 0 0 0 0
1 ddd ghi (99213, 99287) 0 0 0 1 1
2 bbb cde (77085,) 0 1 0 0 0
3 eee ijk (99233, 71020, 36415) 1 0 1 0 0
99233 labels_mg
0 0 (71020,)
1 0 (99213, 99287)
2 0 (77085,)
3 1 (99233, 71020, 36415)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328847.html
下一篇:如何洗掉列中的部分字串值?
