我有三個不同的基于時間的資料幀,有成千上萬個資料點。
df1['time'] = 1, 2, 3, 4, 5
df1['data1'] = 1, 0, 0, 1, 0
df2['time'] = 1, 3, 5, 7, 9
df2['data2'] = a, b, c, d, e
df3['time'] = 3, 4, 5, 6, 7
df3['data3'] = z, y, x, w, v
我想將這些資料幀組合成 1 個資料幀,僅在它們存在相同時間點的情況下。在上述資料幀中,只有時間 3 和 5 同時存在于所有三個資料幀中,因此將這些資料點合并到最終資料幀中。
df4['time'] = 3, 5
df4['data1'] = 0, 0
df4['data2'] = b, c
df4['data3'] = z, x
我一直在嘗試避免使用 if 陳述句迭代資料幀,因為有大量資料點,以及如何在來自 cs95 的Pandas 中迭代 DataFrame 中的行中的答案基本上是說盡可能避免迭代。
我是在遍歷資料幀時卡住了,還是我可以遵循矢量化/串列理解方法?
uj5u.com熱心網友回復:
你想用pd.merge. 我認為它就像一個 SQL 連接,它的作業原理非常相似。在下面的示例中,我正在執行 2 次合并(也稱為連接),首先將df1todf2作為時間列上的內部連接,然后將合并的資料幀與df3再次使用內部連接合并。
import pandas as pd
df1 = pd.DataFrame({'time': [1,2,3,4,5], 'data1': [1,0,0,1,0]})
df2 = pd.DataFrame({'time': [1,3,5,7,9], 'data2': ['a','b','c','d','e']})
df3 = pd.DataFrame({'time': [3,4,5,6,7], 'data3': ['z','y','x','w','v']})
df4 = df1.merge(df2, how='inner', on='time').merge(df3, how='inner', on='time')
df4
Out[211]:
time data1 data2 data3
0 3 0 b z
1 5 0 c x
innerjoin 僅保留兩個資料框中都存在的值。該on欄位指示需要匹配哪些列才能加入。
請注意,最終的結果將包括data1,data2以及data3從每一列的,如果你有一個在資料集相同的名稱,并且不包含在列on,然后他們將與改名_df1,_df2,_df3分別。
uj5u.com熱心網友回復:
您想要time所有三個 DataFrame 的交集,這可以通過在 上進行內部合并來處理'time。默認情況下,merge執行內部合并,因此您可以簡單地使用:
out = df1.merge(df2, on='time').merge(df3, on='time')
輸出:
time data1 data2 data3
0 3 0 b z
1 5 0 c x
uj5u.com熱心網友回復:
你也可以使用pd.concat:
import pandas as pd
df1 = pd.DataFrame({'time': [1,2,3,4,5], 'data1': [1,0,0,1,0]})
df2 = pd.DataFrame({'time': [1,3,5,7,9], 'data2': ['a','b','c','d','e']})
df3 = pd.DataFrame({'time': [3,4,5,6,7], 'data3': ['z','y','x','w','v']})
pd.concat([df.set_index('time') for df in [df1, df2, df3]],
axis=1,
join='inner').reset_index()
它給:
time data1 data2 data3
0 3 0 b z
1 5 0 c x
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408907.html
標籤:
下一篇:將一組中的行附加到熊貓中的另一組
