Python:一次将多个值插入新列

时间:2018-04-17 13:51:53

标签: python pandas dataframe

我的数据框如下所示:

+------+------+------+-----------+
| val1 | val2 | val3 |   col1    |
+------+------+------+-----------+
|    3 |    1 |    1 | something | 
|    4 |    2 |    1 | sth else  |
|    2 |    2 |    3 | something | 
|    3 |    1 |    1 | sth else  |
|    2 |    2 |    1 | something | 
+------+------+------+-----------+

如果符合条件(掩码),我想将值插入3个不同的列中。

对于它的前两列,所以插入通常的字符串就可以了。如何从同一行的其他列插入多个值的乘积。

所以这适用于IssueType,但Value不起作用:

mask = (df.col1 == 'something')
df[['Issue','Type','Value']] = np.where( mask[:, None], ['sth','One', str(np.prod(df.iloc[:, 0:3], axis=1))], ['','',''])

在这种情况下,我想在val1的同一行中将val2val3Value的乘法插入。

期望的输出:

+------+------+------+-----------+-------+------+-------+
| val1 | val2 | val3 |   col1    | Issue | Type | Value |
+------+------+------+-----------+-------+------+-------+
|    3 |    1 |    1 | something | sth   | One  |     3 |
|    4 |    2 |    1 | sth else  |       |      |       |
|    2 |    2 |    3 | something | sth   | One  |    12 |
|    3 |    1 |    1 | sth else  |       |      |       |
|    2 |    2 |    1 | something | sth   | One  |     4 |
+------+------+------+-----------+-------+------+-------+

PS:对标题感到抱歉,很快就难以描述。

4 个答案:

答案 0 :(得分:2)

您可以使用assigncombine_first

执行此操作
df.combine_first(df.assign(**dict(zip(['Issue','Type','Value'],['sth','One', np.prod(df.iloc[:, 0:3], axis=1).values]))).loc[mask,:])

答案 1 :(得分:1)

你可以简单地使用pandas .loc索引器功能:

mask = (df.col1 == 'something')

df.loc[mask,'Issue']='sth'
df.loc[mask,'Type']='One'
df.loc[mask,'Value']=df.loc[mask,'val1']*df.loc[mask,'val2']*df.loc[mask,'val3']

答案 2 :(得分:0)

这需要多个target_module,但它可以完成工作:

assign
由于values = ['val1', 'val2', 'val3'] results = df.val1 * df.val2 * df.val3 df = df.assign(Issue=np.where(mask, 'sth', '')).assign(Type=np.where(mask, 'sth', '')).assign(Value=np.where(mask, results, '')) 中其他参数的值,

Value会自动str

答案 3 :(得分:0)

这需要重新编制索引,并且对于大型集合可能效率不高,但应该做好工作!

df = df.reindex(columns = ['val1', 'val2', 'val3', 'col1', 'Issue','Type','Value'])
df['Issue'], df['Type'], df['Value'] = zip(*df[['val1', 'val2', 'val3', 'col1']].apply(lambda x: ('sth', 'One' , str(np.prod(x[:3])) ) if x[3] == 'something' else (None,None,None), axis = 1))