在熊猫数据框中拆分分组的观察结果

时间:2020-08-09 19:32:38

标签: python pandas dataframe

我的字典mydict包含几个数据帧。每个数据框包含不同数量的观察值,但特征数量相同。 VARIABLEx既是字典中的关键字,也是数据框中的第一个特征。 VARIABLEx可以是数字,字符或数字字符(varnum),并且可能存在“自然”排名/排序。

{'VARIABLE1':   VARIABLE1  Product1  Product2  Product3
0         3       111       999       102
1         2        98       999       104
2         4        97       999        98
3         5       105       999        95
4         1        85       999       110
5         6       101       999        98
6      1--3       999       101       999
7      4--6       999       102       999,
'VARIABLE2':   VARIABLE2  Product1  Product2  Product3
0     Total       105        98       100}

我的问题是关于上表中的VARIABLE1(如果无法显示我在下面提供了代码)。该变量包含的值包括1,2,... 6,以及1--3和4--6;当VARIABLE1遵循第一个“语法”(1、2、3,…6)时,PRODUCT1和PRODUCT3包含实数值,而当VARIABLE1 i遵循第一个“语法”时,则为999(NaN值)。对于PRODUCT2则相反。

我想要的是这个

mydict: {'VARIABLE1':   VARIABLE1  Product1  Product2  Product3
0         3       111       101       102
1         2        98       101       104
2         4        97       101        98
3         5       105       102        95
4         1        85       102       110
5         6       101       102        98
'VARIABLE2':   VARIABLE2  Product1  Product2  Product3
0     Total       105        98       100}

即PRODUCT2的“实际值”替换了相应观察值[1,2,3] [4,5,6]的“ 999”和“分组值”([1--3]和[4--6])从数据框中删除。

我的代码:

import pandas as pd
mydict = {}

dict1 = {'VARIABLE1': ['3', '2', '4', '5', '1', '6', '1--3', '4--6'], 
        'Product1': [111, 98, 97, 105, 85, 101, 999, 999] ,
        'Product2': [999, 999, 999, 999, 999, 999, 101, 102] ,
        'Product3': [102, 104, 98, 95, 110, 98, 999, 999]}
dict2 = {'VARIABLE2': ['Total'], 
        'Product1': [105],
        'Product2': [98],
        'Product3': [100]}

mydict['VARIABLE1'] = pd.DataFrame(dict1)
mydict['VARIABLE2'] = pd.DataFrame(dict2)


print('\n mydict: ')
mydict

1 个答案:

答案 0 :(得分:0)

分步进行:首先定义我们正在研究的df

df = pd.DataFrame(dict1)

分为2个数据帧:

dft = df[df.VARIABLE1.str.contains('--')]
df =  df[~df.VARIABLE1.str.contains('--')]

然后使用split将字符串转换为列表,然后使用lambda函数将其转换为范围,并使用expode方法创建新行。结果存储在df.Product2中:

df.Product2 = dft.assign(VAR1=dft['VARIABLE1'].str.split('--')\
                  .map(lambda r: range(int(r[0]),int(r[1])+1) ))\
                  .explode('VAR1').Product2.values

输出数据帧df

  VARIABLE1  Product1  Product2  Product3
0         3       111       101       102
1         2        98       101       104
2         4        97       101        98
3         5       105       102        95
4         1        85       102       110
5         6       101       102        98  

您终于可以将数据帧写回字典:

mydict['VARIABLE1'] = df