2 回答
![?](http://img1.sycdn.imooc.com/5333a2320001acdd02000200-100-100.jpg)
TA贡献1818条经验 获得超3个赞
您可以使用它groupby来创建一个临时数据帧,您可以对其进行处理并最终与 合并df。
np.random.seed(1) # always add a sample with random state for reproducibility
df = pd.DataFrame(np.random.randint(0,5,size=(5, 5)), columns=list('ABCDE'))
df2 = df.stack().droplevel(-1).reset_index()
df2 = (
df2.groupby(df2.columns.to_list())
.size().unstack()
.fillna(0).astype(int)
)
df = pd.concat([df, df2], axis=1)
输出
A B C D E 0 1 2 3 4
0 3 4 0 1 3 1 1 0 2 1
1 0 0 1 4 4 2 1 0 0 2
2 1 2 4 2 4 0 1 2 0 2
3 3 4 2 4 2 0 0 2 1 2
4 4 1 1 0 1 1 3 0 0 1
我知道这看起来与在 Excel 中添加公式的方式非常相似,但请考虑将数据和结果保留为单独的数据帧(即跳过 ),pd.concat以便在进一步的代码中获得更好的可用性。如果您需要对原始数据执行其他操作,则必须删除这些列,这不是常见的做法,并且使用您的代码的其他人可能不会期望这种行为。
![?](http://img1.sycdn.imooc.com/545868190001d52602200220-100-100.jpg)
TA贡献1890条经验 获得超9个赞
稍微澄清一下问题。
df
A B C D E
0 4 3 4 2 0
1 0 4 2 3 3
2 3 4 1 2 1
3 0 2 3 0 2
4 2 4 1 3 2
跨行的所需结果:取第 0 行。
计算行中 0 的出现次数。有 1. 将其放入“Ranking_0”列中
计算行中 1 的出现次数。有 0 个。将其放入“Ranking_1”列中
等等
所需输出:
A B C D E Ranking_0 Ranking_1 Ranking_2 Ranking_3 Ranking_4
0 4 3 4 2 0 1 0 1 1 2
1 0 4 2 3 3 1 0 1 2 1
2 3 4 1 2 1 0 2 1 1 1
3 0 2 3 0 2 2 0 2 1 0
4 2 4 1 3 2 0 1 2 1 1
有很多方法可以做到这一点 - 所以我将使用一种对我有用但稍微简化的方法。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,5,size=(5, 5)), columns=list('ABCDE'))
# The numbers you want to check for
nums = [0,1,2,3,4]
for num in nums:
df['Ranking_'+str(num)] = (df.iloc[:,0:5]).isin({num}).sum(1)
小心地对前 5 列进行求和,否则您将开始在 Ranking_ 列中添加内容!这就是我这样做的原因
df.iloc[:,0:5)
我用它
.isin({})
只是因为它很干净。还有其他方法。.sum(1)
沿水平行求和(轴=1)
添加回答
举报