在pandas python

时间:2016-01-22 13:35:54

标签: python python-3.x pandas

我有一个csv文件,我正在变成一个pandas数据帧。其中一列a大部分都是数字填充,偶尔会填充零。我想创建一个新列e,该列是a+500列中的数字,但如果0列的该行中有a,则除外。在这些情况下,它应该保持0。或者我想如果列ea+500,它也会起作用,然后e中仅500的所有案例都变为零。任何帮助都会很棒,我是新手使用pandas / python。

3 个答案:

答案 0 :(得分:1)

试试这个:

df['new_a'] = df['a'].astype('int').map(lambda x: x+500 if x != 0 else 0)

答案 1 :(得分:1)

示例数据框

>>> df = pd.DataFrame({'a': [100, 0, 200], 'b': [200, 500, 0]})
>>> df
     a    b
0  100  200
1    0  500
2  200    0

解决方案

您可以使用where快速生成列:

>>> df['e'] = df['a'].where(df['a'] == 0, df['a'] + 500)
>>> df
     a    b    e
0  100  200  600
1    0  500    0
2  200    0  700

效果

对于包含三百万行的数据框:

n = int(1e6)
df = pd.DataFrame({'a': [100, 0, 200] * n, 'b': [200, 500, 0] * n})

使用apply(如此处的另一个答案所示)非常慢:

%timeit df['new_a'] = df['a'].astype('int').map(lambda x: x+500 if x != 0 else 0)
1 loops, best of 3: 2.5 s per loop

与使用where()相比:

%timeit df['e'] = df['a'].where(df['a'] == 0, df['a'] + 500)
10 loops, best of 3: 90.9 ms per loop

它快了大约28倍。

答案 2 :(得分:0)

我建议写一个函数并使用pd.apply这样:

import pandas as pd
df = pd.DataFrame({'a': [0, 1]})
def add500ifnot0(c):
    if c == 0:
        return c
    else:
        return c + 500
df['e'] = df['a'].apply(add500ifnot0)
df