根据条件将列从1 df复制到另一个

时间:2020-01-10 08:47:51

标签: pandas postgresql

我有一种情况,我的数据框中有3列(x,y,point),我正在从另一个df复制id表,但是问题是所有列中的值都不同。我想复制id列与点col使得点1,2,3具有相同的ID。 df是

x           y                 point
76.32       42.58              1
86.34       90.02              2
687.12      125.327            1
65.28       87.11              2
963.1       854.2              3

id colum from df1
M123
P478
Q145
J768
D476

预期输出是

x           y                 point     id
    76.32       42.58              1    M123
    86.34       90.02              2    M123
    687.12      125.327            1    P478
    65.28       87.11              2    P478
    963.1       854.2              3    P478
    85.23       96.23              1    Q145

我正在尝试此代码

df1["id"]=  df["id"]

输出为

x           y                 point     id
    76.32       42.58              1    M123
    86.34       90.02              2    P478
    687.12      125.327            1    Q145
    65.28       87.11              2    j768
    963.1       854.2              3    D476
    85.23       96.23              1    P145

df中有数百行,因此我无法给出行位置。有什么办法吗?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

如果每个组都以1开头,那么可以按字典使用Series.map,则创建每个组的方法是将1Series.eqSeries.cumsum进行比较:< / p>

df['id'] = df['point'].eq(1).cumsum().map(dict(enumerate(df1['id'], 1)))
print (df)
        x        y  point   id
0   76.32   42.580      1  111
1   86.34   90.020      2  111
2  687.12  125.327      1  222
3   65.28   87.110      2  222
4  963.10  854.200      3  222
5   85.23   96.230      1  333

详细信息

print (df['point'].eq(1).cumsum())
0    1
1    1
2    2
3    2
4    2
5    3
Name: point, dtype: int32

或者必要时检查组之间的差异:

df['id'] = df['point'].diff().lt(0).cumsum().map(dict(enumerate(df1['id'])))
print (df)
        x        y  point   id
0   76.32   42.580      1  111
1   86.34   90.020      2  111
2  687.12  125.327      1  222
3   65.28   87.110      2  222
4  963.10  854.200      3  222
5   85.23   96.230      1  333

print (df['point'].diff().lt(0).cumsum())
0    0
1    0
2    1
3    1
4    1
5    2
Name: point, dtype: int32