Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pandas python基于条件将列的一部分插入到列_Python_Pandas - Fatal编程技术网

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
一段代码。这背后的原因是什么?只是为了使模拟数据具有多个块,以便代码可以处理多个块。