Python 当数据帧和元组值匹配时,有条件地从元组值填充数据帧行

Python 当数据帧和元组值匹配时,有条件地从元组值填充数据帧行,python,python-2.7,pandas,dataframe,tuples,Python,Python 2.7,Pandas,Dataframe,Tuples,我试图通过有条件地填充列来更新数据帧。我想比较dataframe行中的值和元组中的值,然后用元组中的另一个值填充同一dataframe行的不同列 例如: foo = pd.DataFrame({"TIME":([1,1,2,2,3,3,4,4,5,5,6,6]), "PLACE": (["place1","place2","place1","place2","place1","place2","place1","place2","place1","place2"

我试图通过有条件地填充列来更新数据帧。我想比较dataframe行中的值和元组中的值,然后用元组中的另一个值填充同一dataframe行的不同列

例如:

foo = pd.DataFrame({"TIME":([1,1,2,2,3,3,4,4,5,5,6,6]),
                 "PLACE": (["place1","place2","place1","place2","place1","place2","place1","place2","place1","place2","place1","place2"]),
                 "Xcords" :(["","","","","","","","","","","",""]),
                 "Ycords" :(["","","","","","","","","","","",""])})
和一个具有位置及其x和y坐标的元组:

bar = [('place1','1','11'),('place3','3','33'),('place2','2','22')]
最后,我希望有以下几点:

     PLACE  TIME Xcords Ycords
0   place1     1      1     11
1   place2     1      2     22
2   place1     2      1     11
3   place2     2      2     22
4   place1     3      1     11
5   place2     3      2     22
6   place1     4      1     11
7   place2     4      2     22
8   place1     5      1     11
9   place2     5      2     22
10  place1     6      1     11
11  place2     6      2     22
因此,如果dataframe“PLACE”列值与同一dataframe行中的元组第一个值匹配,则应使用元组的第二个和第三个值填充XCODS和YCODS。这应该适用于所有实例,因为它们可能会出现多次

对于这样的东西,正确的语法是什么?我尝试过这个方法,但我的所有X_跳线和Y_跳线行最终都具有相同的值:

for i in bar:
    if any(foo["PLACE"]==i[0]):
        foo.X_cords = i[1]
        foo.Y_cords = i[2]
由于两个数据集都非常大,也可以避免for循环吗?

这就是您想要的吗

In [191]: bar_df = pd.DataFrame(bar, columns=['PLACE','Xcords','Ycords'])

In [192]: bar_df
Out[192]:
    PLACE Xcords Ycords
0  place1      1     10
1  place3      3     30
2  place2      2     20

In [193]: pd.merge(foo[['PLACE','TIME']], bar_df, on='PLACE', how='left')
Out[193]:
     PLACE  TIME Xcords Ycords
0   place1     1      1     10
1   place2     1      2     20
2   place1     2      1     10
3   place2     2      2     20
4   place1     3      1     10
5   place2     3      2     20
6   place1     4      1     10
7   place2     4      2     20
8   place1     5      1     10
9   place2     5      2     20
10  place1     6      1     10
11  place2     6      2     20
或者正如@Alexander提到的:

In [235]: foo[['PLACE','TIME']].merge(bar_df, on='PLACE', how='left')
Out[235]:
     PLACE  TIME Xcords Ycords
0   place1     1      1     10
1   place2     1      2     20
2   place1     2      1     10
3   place2     2      2     20
4   place1     3      1     10
5   place2     3      2     20
6   place1     4      1     10
7   place2     4      2     20
8   place1     5      1     10
9   place2     5      2     20
10  place1     6      1     10
11  place2     6      2     20
这就是你想要的吗

In [191]: bar_df = pd.DataFrame(bar, columns=['PLACE','Xcords','Ycords'])

In [192]: bar_df
Out[192]:
    PLACE Xcords Ycords
0  place1      1     10
1  place3      3     30
2  place2      2     20

In [193]: pd.merge(foo[['PLACE','TIME']], bar_df, on='PLACE', how='left')
Out[193]:
     PLACE  TIME Xcords Ycords
0   place1     1      1     10
1   place2     1      2     20
2   place1     2      1     10
3   place2     2      2     20
4   place1     3      1     10
5   place2     3      2     20
6   place1     4      1     10
7   place2     4      2     20
8   place1     5      1     10
9   place2     5      2     20
10  place1     6      1     10
11  place2     6      2     20
或者正如@Alexander提到的:

In [235]: foo[['PLACE','TIME']].merge(bar_df, on='PLACE', how='left')
Out[235]:
     PLACE  TIME Xcords Ycords
0   place1     1      1     10
1   place2     1      2     20
2   place1     2      1     10
3   place2     2      2     20
4   place1     3      1     10
5   place2     3      2     20
6   place1     4      1     10
7   place2     4      2     20
8   place1     5      1     10
9   place2     5      2     20
10  place1     6      1     10
11  place2     6      2     20

如果
11
22
来自哪里?我编辑了元组,它应该是1,11-2,22-3,33,如果
11
22
来自哪里?我编辑了元组,它应该是1,11-2,22-3,33
foo.merge(bar_-df,on='PLACE',how='left')
也应该工作得很好。事实上,这就成功了。对pandas来说相当陌生:-)合并工具似乎非常强大,将证明对我的碎片数据集非常有用。我想我现在有一些书要读……谢谢
foo.merge(bar_-df,on='PLACE',how='left')
也应该可以很好地工作。事实上,这就成功了。对pandas来说相当陌生:-)合并工具似乎非常强大,将证明对我的碎片数据集非常有用。我想我现在有一些书要读……谢谢!