我的字典mydict包含几个数据帧。每个数据框包含不同数量的观察值,但特征数量相同。 VARIABLEx既是字典中的关键字,也是数据框中的第一个特征。 VARIABLEx可以是数字,字符或数字字符(varnum),并且可能存在“自然”排名/排序。
我的问题是关于上表中的VARIABLE1(如果无法显示我在下面提供了代码)。该变量包含的值包括1,2,... 6,以及1--3和4--6;当VARIABLE1遵循第一个“语法”(1、2、3,…6)时,PRODUCT1和PRODUCT3包含实数值,而当VARIABLE1 i遵循第一个“语法”时,则为999(NaN值)。对于PRODUCT2则相反。
我想要的是这个
即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
答案 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