Python Pandas对列的操作

8

你好,我希望了解在 Python 中使用 Pandas 进行列操作的最佳方法。

我有一个经典数据库,将其加载为数据框(dataframe)。我经常需要执行像这样的操作:对于每一行,如果标注为“A”的列中的值大于 x,则用列“C”减去列“D”替换此值。

目前,我做的类似于:

for i in len(df.index):
    if df.ix[i,'A'] > x :
        df.ix[i,'A'] = df.ix[i,'C'] - df.ix[i, 'D']

我想知道是否有更简单和更有效的方法来执行这些操作,因为我的数据库很大。我尝试过不使用for i循环的方法,就像在R或Stata中一样,但我被建议使用“a.any”或“a.all”,但我在这里或pandas文档中都没有找到任何信息。提前感谢。

代码有一个错误:len(df.index)返回一个整数,无法进行迭代。 应该这样做才正确 for i in range(0, len(df.index)) 以便迭代数据框。 - Salvatore Cosentino
4个回答

7

在我看来,最简单的方法。

from random import randint, randrange, uniform
import pandas as pd
import numpy as np

df = pd.DataFrame({'a':randrange(0,10),'b':randrange(10,20),'c':np.random.randn(10)})

#If colC > 0,5, then ColC = ColB - Cola 
df['c'][df['c'] > 0.5] = df['b'] - df['a']

测试过了,它能正常工作。

a   b   c
2  11 -0.576309
2  11 -0.578449
2  11 -1.085822
2  11  9.000000
2  11  9.000000
2  11 -1.081405

1
它运行得很好!但是在第一次执行时会返回一个警告:>>> df['c'][df['c'] > 0.5] = df['b'] - df['a'] __main__:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame - MaxiReglisse

7
你可以使用DataFrame的.loc.ix属性与布尔掩码一起使用。
mask = df['A'] > 2
df.ix[mask, 'A'] = df.ix[mask, 'C'] - df.ix[mask, 'D']

如果您有许多分支事项,可以执行以下操作:
def func(row):
    if row['A'] > 0:
        return row['B'] + row['C']
    elif row['B'] < 0:
        return row['D'] + row['A']
    else:
        return row['A']

df['A'] = df.apply(func, axis=1)

apply通常比for循环快得多。


实际上我有几个条件:如果 df.['A'] == 999;如果 df['A'] < 999 并且 df['B'] == 999 等等... 我不确定这个布尔值如何扩展。 - Anthony Martin
你提供的例子是:(df['A'] == 999) & (df['B'] == 999),但如果你有带有else语句的分支,你应该沿着轴使用apply - Viktor Kerkez
这确实适用于我的某些情况,谢谢;但在其他情况下,我必须考虑实际不同的值,例如对于分类变量:如果row['A'] == 1,则为A1,如果row['A'] == 2,则为A2,如果row['A'] == 3,则为A3等等。 - Anthony Martin
我在答案中添加了一个例子,涵盖了这种情况(使用 apply)。 - Viktor Kerkez

0

有很多方法可以做到这一点,但这是我发现最容易阅读的模式。

#Assume df is a Panda's dataframe object
idx = df.loc[:, 'A'] > x
df.loc[idx, 'A'] = df.loc[idx, 'C'] - df.loc[idx, 'D']

设置小于x的元素就像df.loc[~idx, 'A'] = 0这样简单。

0

从这里开始...

df = pd.DataFrame({'a':randrange(1,10),'b':randrange(10,20),'c':np.random.randn(10)})
a   b   c
0   7   12  0.475248
1   7   12  -1.090855
2   7   12  -1.227489
3   7   12  0.163929

以...结尾

df.ix[df.A < 1,df.A = df['c'] - df['d']]; df
    a   b   c
0   7   12  5.000000
1   7   12  5.000000
2   7   12  5.000000
3   7   12  5.000000
4   7   12  1.813233

抱歉,但这会导致语法错误:>>> df.ix[df.A < 1,df.A = df['c'] - df['d']]; df File "<stdin>", line 1 df.ix[df.A < 1,df.A = df['c'] - df['d']]; df ^ SyntaxError: invalid syntax - MaxiReglisse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接