我有成对的数据,行成对出现,它们的 id
名为 a
和 b
:
>>> df = pd.DataFrame([['1a', 'A', 5], ['1b', 'B', 10], ['2a', 'C', 20],['2b', 'D', 4]], columns=['id', 'name', 'count'])
>>> df
id name count
0 1a A 5
1 1b B 10
2 2a C 20
3 2b D 4
1a
和1b
是一对,2a
和2b
是另一对。我想创建一个新列 rel_count
,其中的值是该行自己的 count
除以其伙伴的 count
:
id name count rel_count
0 1a A 5 0.5
1 1b B 10 2.0
2 2a C 20 5.0
3 2b D 4 0.2
在 pandas 中执行此操作的最佳方法是什么?
最佳答案
您可以通过 ravel reshape 二维数组、翻转和平整:
df = pd.DataFrame([['1a', 'A', 5], ['1b', 'B', 10],
['2a', 'C', 20],['2b', 'D', 4],
['3a', 'C', 10],['3b', 'D', 5]],
columns=['id', 'name', 'count'])
print (df)
id name count
0 1a A 5
1 1b B 10
2 2a C 20
3 2b D 4
4 3a C 10
5 3b D 5
#if not sorting by pairs
#df = df.sort_values('id')
a = df['count'].values.reshape(-1, 2)[:, ::-1].ravel()
print (a)
[10 5 4 20 5 10]
如果可能以某种方式区分组 - 第一个字母如 @Zero 注释或提取第一个 int
值:
g = df['id'].str.extract('(\d+)', expand=False)
a = df.groupby(g)['count'].transform(lambda x: x[::-1])
print (a)
0 10
1 5
2 4
3 20
4 5
5 10
Name: count, dtype: int64
print (g)
0 1
1 1
2 2
3 2
4 3
5 3
Name: id, dtype: object
df['rel_count'] = df['count'] / a
print (df)
id name count rel_count
0 1a A 5 0.5
1 1b B 10 2.0
2 2a C 20 5.0
3 2b D 4 0.2
4 3a C 10 2.0
5 3b D 5 0.5
关于python - Pandas :添加从行和伙伴行计算的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48404120/