[英]Create new rows to pandas dataframe based on condition efficiently
我有兩個 Pandas 數據框:一個帶有 ID 和值,另一個將 ID 與其他 ID 映射。 目標是創建一個基於 df1 的新數據框。 它循環遍歷 df1 中的每個 sourceId 並查找 df2(一個映射 df)以查找 sourceId 中的匹配項。 如果找到匹配項,則會創建一個新行,其值與 df1 中的值相同。 因此,如果找到多個匹配項,則循環會創建多行(例如,ID 為 A 和 C)。 如果只找到一個匹配項(例如,id B),則只創建一行。
下面的代碼正是我想要的,但它的執行速度非常慢。 在我的原始數據集中,df1 是 440K 行,df2 有數千個不同 ID 的映射——目前代碼以 10-25 it/s 的速度運行,這太多了。
有沒有更快的方法可以從矩陣計算/numpy/pandas的其他好處中受益?
import pandas as pd
df1 = pd.DataFrame({
'SourceId': ['A', 'B', 'C', 'A', 'C', 'B'],
'value': [1, 5, 12, 30, 32, 55],
'time': [pd.to_datetime('2020-04-04 08:49:52.166498900+0000'),
pd.to_datetime('2020-08-14 06:12:40.860460500+0000'),
pd.to_datetime('2020-05-13 09:20:50.052688900+0000'),
pd.to_datetime('2020-03-09 13:55:17.335340600+0000'),
pd.to_datetime('2020-08-14 09:30:56.359635400+0000'),
pd.to_datetime('2020-01-31 23:03:46.539892900+0000')],
'otherInfo': ['0A10a', '055jA', 'boAqz', '0t,m5A', '09tjq1', 'akk_1!']})
df2 = pd.DataFrame({'SourceId': ['A', 'A', 'B', 'C', 'C', 'C'], 'TargetId': ['A', 'Q', 'B', 'C', 'B', 'X'], 'trueIfMatch': [1, 0, 1, 1, 0, 0]})
df3 = pd.DataFrame()
for r in df1.itertuples():
SourceId = r.SourceId
value = r.value
time = r.time
otherInfo = r.otherInfo
if SourceId in df2.SourceId.unique():
entries = df2.loc[df2.SourceId == SourceId].TargetId.tolist()
for entry in entries:
df3 = df3.append({
'sourceId': SourceId,
'targetId': entry,
'value': value,
'time': time,
'otherInfo': otherInfo
}, ignore_index=True)
display(df3)
將df.merge
與sort_values
df.merge
使用:
In [2293]: df3 = df1.merge(df2, on='SourceId').sort_values('value')
In [2294]: df3
Out[2294]:
SourceId value TargetId
0 A 1 A
1 A 1 Q
4 B 5 B
6 C 12 C
7 C 12 B
8 C 12 X
2 A 30 A
3 A 30 Q
9 C 32 C
10 C 32 B
11 C 32 X
5 B 55 B
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.