我有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发行版
答案 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]