我是熊猫数据框的新手,要完成此任务还有些棘手。
文本格式:
SegmentUpper SegmentLower物料编号LowerLimitAVLower LowerLimitAVUpper UpperLimitAVUpper UpperLimitAVLower RawSegments SiteID参数ParameterDesc
A高位A低位111 0 1 2 3 [] 2 P1 {'abc':'p1'}
B上层B下层111 1 2 3 4 [] 2 P1 {'abc':'p1'}
C高C低111 2 3 4 5 [] 2 P1 {'abc':'p1'}
D高D低111 3 4 5 6 [] 2 P1 {'abc':'p1'}
A上层A下层111 1 2 3 4 [] 2 P2 {'abc':'p2'}
B上层B下层111 3 2 3 4 [] 2 P2 {'abc':'p2'}
C高C低111 3 3 4 6 [] 2 P2 {'abc':'p2'}
D高D低111 2 4 5 7 [] 2 P2 {'abc':'p2'}
A上A下222 0 3 4 5 [] 2 P1 {'abc':'p1'}
B上B下222 3 5 7 9 [] 2 P1 {'abc':'p1'}
C上C下222 2 5 7 8 [] 2 P1 {'abc':'p1'}
D上D下222 3 8 6 9 [] 2 P1 {'abc':'p1'}
我必须创建一个类型为list的新列,并将多个字典值存储到其中。
基本上,如上图所示,我能够找到使用以下代码将列“ Rawsegment ”列为列表的方法:
DataDF['RawSegment'] = np.empty((len(DataDF), 0)).tolist()
现在最棘手的部分是使用现有数据框中其他列的值向其中添加字典值
例如:我有一个列,分别为Segment Upper,Segment Lower,LowerLimitAVLower,LowerLimitAVUpper,UpperLimitAVLower,UpperLimitAVLower,MaterialNumber
每种物料编号和参数将所有A,B,C,D上,下限值作为字典存储,并保留其他列。
任何帮助将不胜感激。
答案 0 :(得分:1)
首先将列MaterialNumber
转换为索引列和rename
列,以将_
拆分为stack
的3列DataFrame
,然后将groupby与{{ 3}}和apply
(针对字典):
d = {'SegmentUpper':'Upper_Segment',
'SegmentLower':'Lower_Segment',
'LowerLimitAVLower':'Lower_LimitAVLower',
'LowerLimitAVUpper':'Lower_LimitAVUpper',
'UpperLimitAVUpper':'Upper_LimitAVUpper',
'UpperLimitAVLower':'Upper_LimitAVLower'}
df = df.set_index('MaterialNumber').rename(columns=d)
df.columns = df.columns.str.split('_', expand=True)
df1 = (df.stack(0)[['Segment','LimitAVLower','LimitAVUpper']]
.groupby(level=0).apply(lambda x: x.to_dict('r'))
.reset_index(name='RawSegments'))
print (df1)
MaterialNumber RawSegments
0 111 [{'Segment': 'A Lower', 'LimitAVLower': 0.0, '...
1 222 [{'Segment': 'A Lower', 'LimitAVLower': 0.0, '...