Python pandas根据条件和模式添加列值

eeq64g8w  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(90)

我的python pandas panderrame最初使用openpyxl引擎来处理excel处理,可以简单的描述为

df1 = pd.DataFrame({"col1":["",99,88,np.nan,66,55,np.nan,11,22],"col2":['Catg0','Asset1','Other','Catg1','H & F','Large Item','Catg2','Fragile','Delicate item'],"col3":["",0,0,np.nan,99,155,np.nan,83,115]})

  col1           col2 col3
0               Catg0
1   99         Asset1    0
2   88          Other    0
3  NaN          Catg1  NaN
4   66          H & F   99
5   55     Large Item  155
6  NaN          Catg2  NaN
7   11        Fragile   83
8   22  Delicate item  115

虽然我试图让它得到进一步修改有新的列(col4)通过旋转值从其他列(col2)时,其他列的数据是空的或楠为该行,直到下一个这样的条件满足
它应该在透视后删除该行

col1   col4           col2  col3
0    99  Catg0         Asset1     0
1    88  Catg0          Other     0
2    66  Catg1          H & F    99
3    55  Catg1     Large Item   155
4    11  Catg2        Fragile    83
5    22  Catg2  Delicate item   115

import pandas as pd
import numpy as np
df1 = pd.DataFrame({"col1":["",99,88,np.nan,66,55,np.nan,11,22],"col2":['Catg0','Asset1','Other','Catg1','H & F','Large Item','Catg2','Fragile','Delicate item'],"col3":["",0,0,np.nan,99,155,np.nan,83,115]})
df1.insert(1, "col4", 'Catg')


我试图找到一种方法来添加这些基于模式或条件逻辑来填充'col4'并丢弃这些行

vddsk6oq

vddsk6oq1#

您可以通过没有col2的所有列来识别空或nan s,首先通过DataFrame.drop来删除列,如果所有其他列都是DataFrame.all,则替换NaN s并测试空字符串,然后添加Series.where并向前填充重复类别的缺失值,最后在boolean indexing中过滤掉这些行:

m = df1.drop('col2', axis=1).fillna('').eq('').all(axis=1)
df1.insert(1, "col4", df1['col2'].where(m).ffill())

out = df1[~m].reset_index(drop=True)
print (out)
  col1   col4           col2 col3
0   99  Catg0         Asset1    0
1   88  Catg0          Other    0
2   66  Catg1          H & F   99
3   55  Catg1     Large Item  155
4   11  Catg2        Fragile   83
5   22  Catg2  Delicate item  115

字符串
另一种方法是使用模式获取col2值-例如,这里以Catg开头,数字:

m = df1['col2'].str.contains('^Catg\d+$')
df1.insert(1, "col4", df1['col2'].where(m).ffill())

out = df1[~m].reset_index(drop=True)
print (out)
  col1   col4           col2 col3
0   99  Catg0         Asset1    0
1   88  Catg0          Other    0
2   66  Catg1          H & F   99
3   55  Catg1     Large Item  155
4   11  Catg2        Fragile   83
5   22  Catg2  Delicate item  115

kb5ga3dv

kb5ga3dv2#

另一种可能的解决方案是使用cumsum来定义组,然后使用groupbyapply来修改分组的多个帧:

(df1.assign(grp = (df1['col3'].isna() | df1['col3'].eq('')).cumsum())
 .groupby('grp', as_index = False)
 .apply(lambda x: x.tail(len(x)-1)
        .assign(col4 = x.head(1)['col2'].tolist() * (len(x)-1)))
 .reset_index(drop = True)[['col1','col4','col2','col3']])

字符串
输出量:

col1   col4           col2 col3
0   99  Catg0         Asset1    0
1   88  Catg0          Other    0
2   66  Catg1          H & F   99
3   55  Catg1     Large Item  155
4   11  Catg2        Fragile   83
5   22  Catg2  Delicate item  115

相关问题