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