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