我有一个与此帖子密切相关的问题: 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]=0
,df[Q2]=0
,df[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
及其conditions
和choices
非常适合 single 数据框列的条件赋值,但我还没有找到一种整洁的方法使条件能够为多个数据框列分配值。