6

嗨,我想知道使用 pandas 对 python 中的列进行操作的最佳方法。

我有一个作为数据框加载的经典数据库,我经常需要对每一行进行操作,如果标记为“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 文档中都没有找到任何东西。

提前谢谢。

4

4 回答 4

6

您可以只使用带有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 循环快得多。

于 2013-08-12T08:13:52.153 回答
6

在我看来最简单。

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
于 2015-04-07T20:39:20.417 回答
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 一样简单

于 2015-04-07T20:01:59.153 回答
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
于 2016-06-12T06:20:08.767 回答