Python 从另一行值向用户赋值
我有以下资料:Python 从另一行值向用户赋值,python,pandas,Python,Pandas,我有以下资料: data = {'id':[1, 1, 1, 2, 2, 2, 2, 3, 3], 'login': ['2013-05', '2013-05', '2013-06', '2013-06', '2013-07', '2013-07', '2013-08', '2013-06', '2013-07'], 'rn': [1, 2, 3, 1, 2, 3, 4, 1, 2] } 我想用值添加“category”列,其中rn=1。 我在尝试这个: data['cat
data = {'id':[1, 1, 1, 2, 2, 2, 2, 3, 3],
'login': ['2013-05', '2013-05', '2013-06', '2013-06', '2013-07', '2013-07', '2013-08', '2013-06', '2013-07'],
'rn': [1, 2, 3, 1, 2, 3, 4, 1, 2]
}
我想用值添加“category”列,其中rn=1。
我在尝试这个:
data['category'] = data[data['rn'] == 1]['login']
但它只为rn=1的行分配类别。结果:
+----+---------+----+----------+
| id | login | rn | category |
+----+---------+----+----------+
| 1 | 2013-05 | 1 | 2013-05 |
| 1 | 2013-05 | 2 | NaN |
| 1 | 2013-06 | 3 | NaN |
| 2 | 2013-06 | 1 | 2013-06 |
| 2 | 2013-06 | 2 | NaN |
| 2 | 2013-07 | 3 | NaN |
| 3 | 2013-06 | 1 | 2013-06 |
| 3 | 2013-07 | 2 | NaN |
+----+---------+----+----------+
我希望得到以下结果:
+----+---------+----+----------+
| id | login | rn | category |
+----+---------+----+----------+
| 1 | 2013-05 | 1 | 2013-05 |
| 1 | 2013-05 | 2 | 2013-05 |
| 1 | 2013-06 | 3 | 2013-05 |
| 2 | 2013-06 | 1 | 2013-06 |
| 2 | 2013-06 | 2 | 2013-06 |
| 2 | 2013-07 | 3 | 2013-06 |
| 3 | 2013-06 | 1 | 2013-06 |
| 3 | 2013-07 | 2 | 2013-06 |
+----+---------+----+----------+
首先按条件筛选,创建系列,最后使用: 如果
rn==1
存在且每组始终为第一,则可能通过创建错误值,然后向前填充缺失值:
data['category'] = data['login'].where(data['rn'] == 1).ffill()
print (data)
id login rn category
0 1 2013-05 1 2013-05
1 1 2013-05 2 2013-05
2 1 2013-06 3 2013-05
3 2 2013-06 1 2013-06
4 2 2013-07 2 2013-06
5 2 2013-07 3 2013-06
6 2 2013-08 4 2013-06
7 3 2013-06 1 2013-06
8 3 2013-07 2 2013-06
使用
Ex.
import pandas as pd
data = {'id':[1, 1, 1, 2, 2, 2, 2, 3, 3],
'login': ['2013-05', '2013-05', '2013-06', '2013-06', '2013-07', '2013-07', '2013-08', '2013-06', '2013-07'],
'rn': [1, 2, 3, 1, 2, 3, 4, 1, 2]
}
df = pd.DataFrame(data)
df['category'] = df[df['rn'] == 1]['login']
df['category'].ffill(inplace=True)
print(df)
O/p:
id login rn category
0 1 2013-05 1 2013-05
1 1 2013-05 2 2013-05
2 1 2013-06 3 2013-05
3 2 2013-06 1 2013-06
4 2 2013-07 2 2013-06
5 2 2013-07 3 2013-06
6 2 2013-08 4 2013-06
7 3 2013-06 1 2013-06
8 3 2013-07 2 2013-06
哈罗,巴拉特克。非常感谢,但耶斯雷尔刚刚发布了一个答案。我真的很喜欢你的解决方案,干净和简单!
id login rn category
0 1 2013-05 1 2013-05
1 1 2013-05 2 2013-05
2 1 2013-06 3 2013-05
3 2 2013-06 1 2013-06
4 2 2013-07 2 2013-06
5 2 2013-07 3 2013-06
6 2 2013-08 4 2013-06
7 3 2013-06 1 2013-06
8 3 2013-07 2 2013-06