【问题标题】:Conditionally populate dataframe row from tuple values when dataframe and tuple values match当数据帧和元组值匹配时,有条件地从元组值填充数据帧行
【发布时间】:2016-04-07 16:59:25
【问题描述】:

我正在尝试通过有条件地填充列来更新我的数据框。我想将数据帧行中的值与元组的值进行比较,然后用元组中的另一个值填充同一数据帧行的不同列。

例如:

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

因此,如果数据框“PLACE”列值与同一数据框行中的元组第一个值匹配,则 Xcords 和 Ycords 应填充元组的第二个和第三个值。这应该发生在所有实例上,因为它们可能出现不止一次。

这样的正确语法是什么?我已经尝试过了,但是我所有的 X_cords 和 Y_cords 行最终都具有相同的值:

for i in bar:
    if any(foo["PLACE"]==i[0]):
        foo.X_cords = i[1]
        foo.Y_cords = i[2]

由于两个数据集都非常大,是否也可以避免 for 循环?

【问题讨论】:

  • 11 和 22 来自哪里?
  • 我编辑了元组,它应该是 1,11-2,22-3,33

标签: python python-2.7 pandas dataframe tuples


【解决方案1】:

这就是你想要的吗?

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

【讨论】:

  • foo.merge(bar_df, on='PLACE', how='left') 也应该可以正常工作。
  • 确实成功了。对 pandas 来说相当新 :-) 合并工具似乎非常强大,并且对我的碎片化数据集非常有帮助。我想我现在有一些阅读要做......谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2018-11-16
  • 2019-03-26
  • 2021-05-09
相关资源
最近更新 更多