Pandas:基于现有数据,将列附加到数据框,作为链式操作
Pandas: Appending a column to a data frame, based on the existing data, as a chained operation
我创建了一个数据框:
import pandas as pd
df = pd.DataFrame({'FOO': [0,1,2], 'BAR': ['a','b','c']})
FOO BAR
0 0 a
1 1 b
2 2 c
现在我过滤行,并根据现有列的值附加一列:
df = df[lambda x: x['FOO']>0]
df['BAZ'] = df['BAR'].map(lambda x: x+'z')
FOO BAR BAZ
1 1 b bz
2 2 c cz
是否可以以操作链的方式在一行中过滤和追加一列?
我可以做到这一点:
df = df[lambda x: x['FOO']>0].join(df[lambda x: x['FOO']>0]['BAR'].map(lambda x: x+'z').rename('BAZ'))
但这是不可取的,因为我必须重复过滤。
您可以 assign
在过滤器后使用 lambda
:
df.loc[df.FOO.gt(0)].assign(BAZ = lambda x: x.BAR+'z')
# FOO BAR BAZ
#1 1 b bz
#2 2 c cz
也可以先赋值再过滤,但是如果过滤掉很多行,性能就不会那么好了:
df.assign(BAZ = df.BAR+'z').loc[df.FOO.gt(0)]
我创建了一个数据框:
import pandas as pd
df = pd.DataFrame({'FOO': [0,1,2], 'BAR': ['a','b','c']})
FOO BAR
0 0 a
1 1 b
2 2 c
现在我过滤行,并根据现有列的值附加一列:
df = df[lambda x: x['FOO']>0]
df['BAZ'] = df['BAR'].map(lambda x: x+'z')
FOO BAR BAZ
1 1 b bz
2 2 c cz
是否可以以操作链的方式在一行中过滤和追加一列? 我可以做到这一点:
df = df[lambda x: x['FOO']>0].join(df[lambda x: x['FOO']>0]['BAR'].map(lambda x: x+'z').rename('BAZ'))
但这是不可取的,因为我必须重复过滤。
您可以 assign
在过滤器后使用 lambda
:
df.loc[df.FOO.gt(0)].assign(BAZ = lambda x: x.BAR+'z')
# FOO BAR BAZ
#1 1 b bz
#2 2 c cz
也可以先赋值再过滤,但是如果过滤掉很多行,性能就不会那么好了:
df.assign(BAZ = df.BAR+'z').loc[df.FOO.gt(0)]