我有 2 个数据框 df1
和 df2
,每个数据框一列。我想逐行比较它们,如果列中的值匹配,则创建一个包含所有匹配值的新数据框。如果没有,请为不匹配的值创建一个包含 2 列的数据框。
equal_index = []
equal_df1 = []
not_equal_index = []
not_equal_df1 = []
not_equal_df2 = []
for x in df1.index.tolist():
if df1['column'].ix[x] == df2['column'].ix[x]:
equal_index.append(x)
equal_df1.append(df1['column'].ix[x])
else:
not_equal_index.append(x)
not_equal_df1.append(df1['column'].ix[x])
not_equal_df2.append(df2['column'].ix[x])
DF_equal = pd.DataFrame({"column":equal_df1}, index = equal_index )
DF_not_equal = pd.DataFrame({'column1':not_equal_df1,'column2':not_equal_df2}, index = not_equal_index)
看起来应该可以工作,但我收到错误:ValueError:系列的真值不明确。
如果我尝试一些基本的东西
for x in df1.index.tolist():
print df1['column'].ix[x] == df2['column'].ix[x]
对于尽可能多的 x,我得到 True
或 False
如果我使用 is
而不是 ==
,我会得到 DF_not_equal
中的所有值。
最佳答案
import pandas as pd
df = pd.DataFrame({0:['test','test2','test3'], 1:['foo','foo2','foo3'], 2:['bar','bar2', 'bar3']})
df2 = pd.DataFrame({0:['test','test2','test4'], 1:['foo','foo2','foo3'], 2:['bar','bar2', 'bar3']})
df_equal = pd.DataFrame()
df_not_equal = pd.DataFrame()
for i in range(df.shape[0]):
if all(df.loc[i].values==df2.loc[i].values):
df_equal = df_equal.append(df.loc[i], ignore_index=True)
else:
df_not_equal['A'] = df.loc[i]
df_not_equal['B'] = df2.loc[i]
print(df_equal)
print(df_not_equal)
会给你:
0 1 2
0 test foo bar
1 test2 foo2 bar2
A B
0 test3 test4
1 foo3 foo3
2 bar3 bar3
查看您提供的错误,问题出在if df1['column'].ix[x] == df2['column'].ix[x]:
。 pandas
不允许这种类型的比较,这就是为什么他们说“不明确”。
通过使用该行的实际值可以解决该问题,您需要检查all
或any
(我希望这些是不言自明的)。
关于python - 比较 2 个数据框并创建一个新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33153456/