Python方法将1 value_id与不同数据帧中的其他列'value_id进行比较?

时间:2014-01-30 21:20:54

标签: python csv pandas comparison dataframe

我有2个csv文件。每个包含一个包含多列和ASSET_ID列的数据集。我使用pandas将每个csv文件作为df1和df2读取。我的问题一直是尝试定义一个函数来迭代df1中的ASSET_ID值,并将每个值与df2中的所有ASSET_ID值进行比较。从那里我想从df1的ASSET_ID返回与df2匹配的所有相应行。任何帮助将不胜感激我已经工作了几个小时,几乎没有显示它。 dtypes是float或int。

我的配置= windows xp,python 2.7 anaconda发行版

1 个答案:

答案 0 :(得分:1)

创建值的布尔掩码将索引2 df匹配的行,无需迭代且速度更快。 例如:

# define a list of values
a = list('abcdef')
b = range(6)
df = pd.DataFrame({'X':pd.Series(a),'Y': pd.Series(b)})
# c has x values for 'a' and 'd' so these should not match
c = list('xbcxef')
df1 = pd.DataFrame({'X':pd.Series(c),'Y': pd.Series(b)})
print(df)
print(df1)

   X  Y
0  a  0
1  b  1
2  c  2
3  d  3
4  e  4
5  f  5

[6 rows x 2 columns]
   X  Y
0  x  0
1  b  1
2  c  2
3  x  3
4  e  4
5  f  5

[6 rows x 2 columns]

In [4]:  

# now index your df using boolean condition on the values
df[df.X == df1.X]

Out[4]:

   X  Y
1  b  1
2  c  2
4  e  4
5  f  5

[4 rows x 2 columns]

编辑:

因此,如果您有不同的长度系列,那么这将无效,在这种情况下您可以使用isin

因此,创建两个不同长度的数据帧:

a = list('abcdef')

b = range(6)

d = range(10)

df = pd.DataFrame({'X':pd.Series(a),'Y': pd.Series(b)})





c = list('xbcxefxghi')

df1 = pd.DataFrame({'X':pd.Series(c),'Y': pd.Series(d)})

print(df)

print(df1)

   X  Y
0  a  0
1  b  1
2  c  2
3  d  3
4  e  4
5  f  5

[6 rows x 2 columns]
   X  Y
0  x  0
1  b  1
2  c  2
3  x  3
4  e  4
5  f  5
6  x  6
7  g  7
8  h  8
9  i  9

[10 rows x 2 columns]

现在使用isin从df1中选择行,其中id存在于df中:

In [7]:

df1[df1.X.isin(df.X)]

Out[7]:

   X  Y
1  b  1
2  c  2
4  e  4
5  f  5

[4 rows x 2 columns]