我有一种情况,我的数据框中有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中有数百行,因此我无法给出行位置。有什么办法吗?任何帮助将不胜感激
答案 0 :(得分:1)
如果每个组都以1
开头,那么可以按字典使用Series.map
,则创建每个组的方法是将1
与Series.eq
和Series.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