Pandas有条件创建多个数据框列

时间:2019-08-01 13:57:50

标签: python pandas dataframe conditional-statements

我有一个与此帖子密切相关的问题: Pandas conditional creation of a series/dataframe column

与该问题的不同之处在于,我想使用一列的值来分配其他许多列中的值。出于效率原因,我想避免在所有条目上编写包含许多if语句的for循环。

我有一个像这样的数据集:

import pandas as pd
df = pd.DataFrame(columns=['Type', 'Set', 'Q1', 'Q2', 'Q3', 'color', 'number'])
df['Type'] = ['A', 'B', 'B', 'C', 'D', 'E', 'C', 'D']

哪个产生:

  Type  Set   Q1   Q2   Q3 color number
0    A  NaN  NaN  NaN  NaN   NaN  NaN
1    B  NaN  NaN  NaN  NaN   NaN  NaN
2    B  NaN  NaN  NaN  NaN   NaN  NaN
3    C  NaN  NaN  NaN  NaN   NaN  NaN
4    D  NaN  NaN  NaN  NaN   NaN  NaN
5    E  NaN  NaN  NaN  NaN   NaN  NaN
6    C  NaN  NaN  NaN  NaN   NaN  NaN
7    D  NaN  NaN  NaN  NaN   NaN  NaN

基于Type中的信息,我想为其他各种列创建值。

例如,对于Type==A,我希望列出数据框中各个行发生的各种变化: df['Set'] = 'Z'df[Q1]=0df[Q2]=0df[Q3]=random.choice(True, False)df[color]='green'df[number]=call_on_some_function_I_defined(input = df[Q1])

Type==B时,我希望这些相同的变量发生某些其他事情: df['Set'] = 'X'df[Q1]=random.choice(0, 250, 500, 750, 1000)

理想情况下,我想按照以下方式进行操作:

import numpy as np

conditions = [
    (df['Type'] == 'A'),
    (df['Type'] == 'B'),
    (df['Type'] == 'C')] #etc.
choices_A = [df['Set'] = 'Z', df[Q1]=0, df[Q2]=0, df[Q3]=random.choice(True, False), df[color]='green', df[number]=call_on_some_function_I_defined(input = df[Q1])]
choices_B = [df['Set'] = 'X', df[Q1]=random.choice(0, 250, 500, 750, 1000)` df[Q2]=random.choice(0, 250, 500, 750, 1000), df[Q3]=False, df[color]='red', df[number]=call_on_some_function_I_defined(input = df[Q2])]

df = np.select(condition[0], choices_A, default=0)
df = np.select(condition[1], choices_B, default=0)

要创建如下输出:

  Type  Set   Q1   Q2   Q3    color number
0    A   Z    0    0   True   green  17
1    B   X   750   0   False   red   85
2    B   X   500  250  False   red   93   #etc

虽然numpy.select及其conditionschoices非常适合 single 数据框列的条件赋值,但我还没有找到一种整洁的方法使条件能够为多个数据框列分配值。

0 个答案:

没有答案