我有 2 个 Pandas 数据帧,它们的长度不等。我在下面引用了一个例子。我的代码应该运行第一个数据帧中苹果的值,并定位它是否存在于第二个数据帧中(第二个数据帧中总是存在一个值)。如果它找到相同的值,那么它应该将 2 个数据帧中橙子的差异存储到第一个数据帧中。我已经使用 2 个 for 循环执行了此任务,如下所示。下面的代码完成了任务,但我的实际数据有 200 万个条目,第二个数据帧有 800 个条目。使用 2 个 for 循环会大大减慢我的程序速度。 有没有更有效的方法来完成这项任务?
trial={'apples': [2,4,1,5,3,2,1,1,4,5],'oranges': [8,5,9,4,2,6,7,5,1,3]}
trial1={'apples': [1,2,3,4,5],'oranges': [2,5,6,3,1]}
df=pd.DataFrame.from_dict(trial)
df1=pd.DataFrame.from_dict(trial1)
F=[]
for i in df.apples.index:
for j in df1.apples.index:
if df.apples.ix[i]== df1.apples.ix[j]:
F.append(df.oranges.ix[i]-df1.oranges.ix[j])
df['difference']=F
最佳答案
您可以在 apples 列上执行 left type merge
,然后可以在冲突的列 diff
和 orange_x
上调用 orange_y
,然后使用 -
反转符号并使用 int
转换为 astype
:
In [159]:
df['difference'] = -df.merge(df1, on='apples', how='left').ix[:, 'oranges_x':].diff(axis=1)['oranges_y'].astype(int)
df
Out[159]:
apples oranges difference
0 2 8 3
1 4 5 2
2 1 9 7
3 5 4 3
4 3 2 -4
5 2 6 1
6 1 7 5
7 1 5 3
8 4 1 -2
9 5 3 2
分解以上内容:
In [162]:
df.merge(df1, on='apples', how='left')
Out[162]:
apples oranges_x oranges_y
0 2 8 5
1 4 5 3
2 1 9 2
3 5 4 1
4 3 2 6
5 2 6 5
6 1 7 2
7 1 5 2
8 4 1 3
9 5 3 1
In [163]:
df.merge(df1, on='apples', how='left').ix[:, 'oranges_x':].diff(axis=1)
Out[163]:
oranges_x oranges_y
0 NaN -3.0
1 NaN -2.0
2 NaN -7.0
3 NaN -3.0
4 NaN 4.0
5 NaN -1.0
6 NaN -5.0
7 NaN -3.0
8 NaN 2.0
9 NaN -2.0
In [164]:
-df.merge(df1, on='apples', how='left').ix[:, 'oranges_x':].diff(axis=1)['oranges_y'].astype(int)
Out[164]:
0 3
1 2
2 7
3 3
4 -4
5 1
6 5
7 3
8 -2
9 2
Name: oranges_y, dtype: int32
如果您的真实数据有更多列,并且列顺序与示例不同,您可以在单独的步骤中执行此操作:
In [170]:
merged = df.merge(df1, on='apples', how='left')
merged['difference'] = merged['oranges_x'] - merged['oranges_y']
merged
Out[170]:
apples oranges_x oranges_y difference
0 2 8 5 3
1 4 5 3 2
2 1 9 2 7
3 5 4 1 3
4 3 2 6 -4
5 2 6 5 1
6 1 7 2 5
7 1 5 2 3
8 4 1 3 -2
9 5 3 1 2
因此,合并后,删除无关的列并重命名回来:
In [171]:
merged = merged.drop('oranges_y', axis=1).rename(columns={'oranges_x':'oranges'})
merged
Out[171]:
apples oranges difference
0 2 8 3
1 4 5 2
2 1 9 7
3 5 4 3
4 3 2 -4
5 2 6 1
6 1 7 5
7 1 5 3
8 4 1 -2
9 5 3 2
关于python - 通过在两个 Pandas 数据帧之间迭代来识别相似的值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42000839/