Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从另一行值向用户赋值_Python_Pandas - Fatal编程技术网

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