下面考虑我的数据框,我想通过将单个标记除以Total来填充百分比列,以获得百分比。
matches()
我已经编写了这样的代码
Name Marks
0 Total 100
1 Name1 45
2 Name2 65
3 name3 93
4 name4 89
但百分比列只为所有行产生0。上面的代码只是一个例子,但我的实际数据会产生一些错误,如下面的
for i in range(0,5):
pcnt=(df['Marks'][i])/(df['Marks'][0])
df['Percentage']=pcnt*100
我在这里做错了什么?
答案 0 :(得分:3)
我相信您可以使用Series.div
按loc
选择的第一行,然后按mul
选择多行:
s = df['Marks'].div(df.loc[0, 'Marks']).mul(100)
print (s)
0 100.0
1 45.0
2 65.0
3 93.0
4 89.0
Name: Marks, dtype: float64
如果真实数据在第一行中没有索引0
,则使用常规解决方案 - 按iloc
按get_loc
选择位置Marks
列位置:
print (df.iloc[0, df.columns.get_loc('Marks')])
100
s = df['Marks'].div(df.iloc[0, df.columns.get_loc('Marks')]).mul(100)
答案 1 :(得分:0)
没有循环的另一种方法是:
index(of:)
您的尝试出现问题
可以按照您的尝试按循环分配值,但通常不推荐。无论如何,你的特定循环不起作用的原因是:
考虑您原来的df['Percentage'] = (df['Marks'] / df.loc[0, 'Marks']) * 100:
>>> df
Name Marks Percentage
0 Total 100 100.0
1 Name1 45 45.0
2 Name2 65 65.0
3 name3 93 93.0
4 name4 89 89.0
:
df
循环的最后一步将>>> df
Name Marks
0 Total 100
1 Name1 45
2 Name2 65
3 name3 93
4 name4 89
分配给单个浮点值。如果这样做,则为整个列分配相同的值:
df['Percentage']
因此,在循环的每次迭代中,您都会将整个列重新分配给最后一次计算的df['Percentage'] = 123.0
>>> df
Name Marks Percentage
0 Total 100 123.0
1 Name1 45 123.0
2 Name2 65 123.0
3 name3 93 123.0
4 name4 89 123.0
。
如果您想更正此问题,您只能在所需的索引处指定pcnt
:
df['percentage']
您遇到的另一个问题是您正在使用chain indexing,由于多种原因(例如for i in range(0,5):
pcnt=(df['Marks'][i])/(df['Marks'][0])
df.loc[i, 'Percentage']=pcnt*100
)而不理想,并且无疑会引导您发出一些警告消息一点。最好使用df['Marks'][i]
的{{1}}方法:
.loc
但这只是为了向您展示问题。在可能的情况下,使用大熊猫时使用矢量化方法而不是循环会更好,但速度更快,一旦掌握了它,它通常更容易编写。