pandas python基于条件将列的一部分插入到列
我有一个很大的数据集要处理,但这里我使用的是模拟数据集:pandas python基于条件将列的一部分插入到列,python,pandas,Python,Pandas,我有一个很大的数据集要处理,但这里我使用的是模拟数据集: data = {'Block': [1, 1, 1, 1, 1, 1,1,1,1], 'Concentration': [100, 100, 100, 33, 33, 33, 0,0,0], 'Name' : ['A', 'A', 'A', 'A', 'A', 'A', 'PB', 'PB', 'PB'], 'value': [86, 194, 452, 140, 285, 2011, 100, 111, 22
data = {'Block': [1, 1, 1, 1, 1, 1,1,1,1],
'Concentration': [100, 100, 100, 33, 33, 33, 0,0,0],
'Name' : ['A', 'A', 'A', 'A', 'A', 'A', 'PB', 'PB', 'PB'],
'value': [86, 194, 452, 140, 285, 2011, 100, 111, 222 ]}
data = DataFrame(data)
看起来像这样:
In [12]: data
Out[12]:
Block Concentration Name value
0 1 100 A 86
1 1 100 A 194
2 1 100 A 452
3 1 33 A 140
4 1 33 A 285
5 1 33 A 2011
6 1 0 PB 100
7 1 0 PB 111
8 1 0 PB 222
每个区块共有24个区块、3种浓度类型和5个名称。
我希望每个区块为每个名称(名称“PB”除外)添加3个新的“0”浓度,然后将“PB”中的值附加到新添加的“0”浓度
对于此处的模拟数据集,所需输出为:
In [13]: data2
Out[13]:
Block Concentration Name value
0 1 100 A 86
1 1 100 A 194
2 1 100 A 452
3 1 33 A 140
4 1 33 A 285
5 1 33 A 2011
6 1 0 A 100
7 1 0 A 111
8 1 0 A 222
9 1 0 PB 100
10 1 0 PB 111
11 1 0 PB 222
到目前为止,我的代码只能抓取每个块的“PB”行:
def PBvalue(sgrp):
PBvalue = sgrp.loc[data['Name']=='PB'].copy()
return PBvalue
PBvalues = data.groupby(['Block', 'Concentration']).apply(PBvalue)
输出:
In [30]: PBvalues
Out[30]:
Block Concentration Name value
Block Concentration
1 0 6 1 0 PB 100
7 1 0 PB 111
8 1 0 PB 222
代码如下:
# create the mock dataframe with 3 blocks
data1 = DataFrame({'Block': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
'Concentration': [100, 100, 100, 33, 33, 33, 100, 100, 100, 33, 33, 33, 0,0,0],
'Name' : ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'PB', 'PB', 'PB'],
'value': [86, 194, 452, 140, 285, 2011, 8, 19, 45, 14, 28, 201, 100, 111, 222 ]})
data2 = data1.copy(); data2.Block = 2
data3 = data1.copy(); data3.Block = 3
data = pd.concat([data1, data2, data3], axis=0)
def temp1(df):
df_others = df[df.Name != 'PB']
df_pb = df[df.Name == 'PB']
def temp2(dfx):
df_app = df_pb.copy()
df_app = df_app[df_app.Concentration==0] # in case name 'PB' have more than one concentrations
df_app['Name'] = dfx['Name'].values[0] ## modified code
df_pername = pd.concat([dfx, df_app])
return df_pername
df1 = df_others.groupby('Name', group_keys=False).apply(temp2)
df2 = pd.concat([df1, df_pb])
return df2
data_changed = data.groupby('Block', group_keys=False).apply(temp1)
data_changed.index = range(len(data_changed))
In [151]: data_changed
Out[151]:
Block Concentration Name value
0 1 100 A 86
1 1 100 A 194
2 1 100 A 452
3 1 33 A 140
4 1 33 A 285
5 1 33 A 2011
6 1 0 A 100
7 1 0 A 111
8 1 0 A 222
9 1 100 B 8
10 1 100 B 19
11 1 100 B 45
12 1 33 B 14
13 1 33 B 28
14 1 33 B 201
15 1 0 B 100
16 1 0 B 111
17 1 0 B 222
18 1 0 PB 100
19 1 0 PB 111
20 1 0 PB 222
.. ... ... ... ...
58 3 0 B 111
59 3 0 B 222
60 3 0 PB 100
61 3 0 PB 111
62 3 0 PB 222
[63 rows x 4 columns]
每个块组的PB值是一致的还是不同的?@EdChum“PB”值对于每个块都是不同的。@Jessica你有没有尝试过任何东西,也发布代码。@WoodChopper是的,请查看我的编辑。第一步是将数据读入Pandas数据框。如果数据帧的格式与上面给出的示例一致,则可以将该函数应用于groupby对象。读取过程中似乎出现了一些错误。我修改了模拟数据和代码,因此模拟数据的“Name”列有两个以上的名称,代码可以处理。谢谢!即使我没有使用
data2=data1.copy();data2.Block=2 data3=data1.copy();data3.Block=3
一段代码。这背后的原因是什么?只是为了使模拟数据具有多个块,以便代码可以处理多个块。