如何在Python熊猫中进行划分

时间:2018-03-10 15:07:30

标签: python pandas dataframe

下面考虑我的数据框,我想通过将单个标记除以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

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

我相信您可以使用Series.divloc选择的第一行,然后按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,则使用常规解决方案 - 按ilocget_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

但这只是为了向您展示问题。在可能的情况下,使用大熊猫时使用矢量化方法而不是循环会更好,但速度更快,一旦掌握了它,它通常更容易编写。