我的数据框如下所示:
+------+------+------+-----------+
| 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个不同的列中。
对于它的前两列,所以插入通常的字符串就可以了。如何从同一行的其他列插入多个值的乘积。
所以这适用于Issue
和Type
,但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
的同一行中将val2
,val3
和Value
的乘法插入。
期望的输出:
+------+------+------+-----------+-------+------+-------+
| 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:对标题感到抱歉,很快就难以描述。
答案 0 :(得分:2)
您可以使用assign
和combine_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))