python - 在 Python 中,如何做 groupby + transform + 一个设计函数来移动一列中的值?
问题描述
我的数据是这样的:
ARTICLE Day Row
a 2 10
a 3 10
a 4 10
a 5 10
a 6 10
a 7 10
a 8 10
a 9 10
a 10 10
a 11 10
b 3 1
我想生成一个名为 Date 的新列。首先,我按文章对数据进行分组。那么对于每个文章组,如果 Row 为 1,则 Date 中的值与 Day 中的值相同。否则,将第一天中的所有值向上移动并将最后一个值设置为 100。因此,新数据应如下所示:
ARTICLE Day Row Date
a 2 10 3
a 3 10 4
a 4 10 5
a 5 10 6
a 6 10 7
a 7 10 8
a 8 10 9
a 9 10 10
a 10 10 11
a 11 10 100
b 3 1 3
我认为这可以通过 groupby 和 transform 来完成。采用一个函数来生成日期。所以,我的代码是:
def myFUN_PostDate1(NRow,Date):
if (NRow.unique()==1):
return Date
else:
Date1 = Date[1:Date.shape[0]]
Date1[Date1.shape[0] + 1] = 19800312
return Date1
a = pd.DataFrame({'ARTICLE': ['a','a','a','a','a','a','a','a','a','a','b'],
'Day': [2,3,4,5,6,7,8,9,10,11,3],
'Row':[10,10,10,10,10,10,10,10,10,10,1]})
a.loc[:,'Date'] = a.groupby(['ARTICLE']).transform(lambda x: myFUN_PostDate1(x.loc[:,'Row'],x.loc[:,'Day']))
但我有错误信息:
pandas.core.indexing.IndexingError: ('Too many indexers', 'occurred at index Day')
我也试过 groupby + np.where。但我有同样的错误。
解决方案
国际大学联盟:
In [14]: df['Date'] = (df.groupby('ARTICLE')['Day']
.apply(lambda x: x.shift(-1).fillna(100) if len(x) > 1 else x))
In [15]: df
Out[15]:
ARTICLE Day Row Date
0 a 2 10 3.0
1 a 3 10 4.0
2 a 4 10 5.0
3 a 5 10 6.0
4 a 6 10 7.0
5 a 7 10 8.0
6 a 8 10 9.0
7 a 9 10 10.0
8 a 10 10 11.0
9 a 11 10 100.0
10 b 3 1 3.0
推荐阅读
- typescript - 如何在 go 中使用 typescript
- r - 如何添加一个 tibble 列,为另一个变量的值组分配值?
- r - 将存储在数据框中的函数应用于 R 中的另一个数据框
- scala - Scala/OCaml 中的 cons 运算符的复杂性是多少?
- ruby - 如何在ruby中将运算符作为参数传递?
- javascript - 在 JavaScript 中访问 Python 数据库
- python - 使用python查找图像中黑色/灰色像素的所有坐标
- c++ - 放置/分段语法是否可能导致惰性“运算符或”重载?
- gradle - 如何让 Intellij IDEA 使用并行和 gradle 构建缓存进行构建
- c - C 中声明 char * VS (char *)