Python 数据帧的元组列表
寻找如何解决以下问题的想法: 我有一个数据框,其中一列包含一个元组列表,如下所示:Python 数据帧的元组列表,python,python-2.7,dataframe,Python,Python 2.7,Dataframe,寻找如何解决以下问题的想法: 我有一个数据框,其中一列包含一个元组列表,如下所示: mydf = pd.DataFrame({ 'Field1' : ['A','B','C'], 'Field2' : ['1','2','3'], 'WeirdField' :[ [ ('xxx', 'F1'), ('yyy','F2') ], [ ('asd', 'F3')
mydf = pd.DataFrame({
'Field1' : ['A','B','C'],
'Field2' : ['1','2','3'],
'WeirdField' :[
[ ('xxx', 'F1'), ('yyy','F2') ],
[ ('asd', 'F3'), ('bla','F4') ],
[ ('123', 'F2'), ('www','F5') ]
]
})
我希望元组第二个位置上的每个元素成为数据帧上的一列,第一个位置上的corespondent值。
对于上面的数据帧,这是我所期望的:
该列表可以有多个元素(示例中不止2个),并且元素的数量可以跨行变化
有人能建议如何轻松实现这一点吗
谢谢首先,我将
mydf['WeirdField']
列展平,这样我们就可以只看到值和列名,而不必担心它们所包含的列表。接下来,您可以使用itertools.groupby
获取每个“F”列的所有对应值和索引
结果如下:
In [84]: mydf
Out[84]:
Field1 Field2 WeirdField F1 F2 F3 F4 F5
0 A 1 [(xxx, F1), (yyy, F2)] xxx yyy NaN NaN NaN
1 B 2 [(asd, F3), (bla, F4)] NaN NaN asd bla NaN
2 C 3 [(123, F2), (www, F5)] NaN 123 NaN NaN www
屈服
Field1 Field2 F1 F2 F3 F4 F5 F6
0 A 1 xxx yyy None None None xyz
1 B 2 None None asd bla None None
2 C 3 mno 123 None None www None
在压缩列值之后考虑一个解决方案。这将适用于WeirdField中任意数量的元组,假设和pivot在同一行中的F重复都不会取最大值:
data =[]
# APPEND TO LIST
for f1,f2,w in zip(mydf['Field1'].values, mydf['Field2'].values, mydf['WeirdField'].values):
for i in w:
data.append((f1, f2) + i)
# CAST LIST OF TUPLES TO DATAFRAME
df = pd.DataFrame(data, columns=['Field1', 'Field2', 'Value', 'Indicator'])
# PIVOT DATAFRAME
pvt = df.pivot_table(index=['Field1', 'Field2'], columns=['Indicator'],
values='Value', aggfunc='max', fill_value=np.nan).reset_index()
pvt.columns.name = None
# Field1 Field2 F1 F2 F3 F4 F5
# 0 A 1 xxx yyy NaN NaN NaN
# 1 B 2 NaN NaN asd bla NaN
# 2 C 3 NaN 123 NaN NaN www
谢谢,这太好了。喜欢没有硬编码的值或字段名。我只需将枚举更改为mydf['WeirdField'].iteritems(),因为我需要保留数据帧索引。
Field1 Field2 F1 F2 F3 F4 F5 F6
0 A 1 xxx yyy None None None xyz
1 B 2 None None asd bla None None
2 C 3 mno 123 None None www None
data =[]
# APPEND TO LIST
for f1,f2,w in zip(mydf['Field1'].values, mydf['Field2'].values, mydf['WeirdField'].values):
for i in w:
data.append((f1, f2) + i)
# CAST LIST OF TUPLES TO DATAFRAME
df = pd.DataFrame(data, columns=['Field1', 'Field2', 'Value', 'Indicator'])
# PIVOT DATAFRAME
pvt = df.pivot_table(index=['Field1', 'Field2'], columns=['Indicator'],
values='Value', aggfunc='max', fill_value=np.nan).reset_index()
pvt.columns.name = None
# Field1 Field2 F1 F2 F3 F4 F5
# 0 A 1 xxx yyy NaN NaN NaN
# 1 B 2 NaN NaN asd bla NaN
# 2 C 3 NaN 123 NaN NaN www