Python 在pandas中重新设计数据帧

Python 在pandas中重新设计数据帧,python,pandas,Python,Pandas,我有一个包含两列的pandas数据框:item和value。value列的值是元组列表,其中第一个元素是字段,第二个元素是计数 **item value** item1 item2 item3 [('f1', 10L), ('f3', 5L)] item4 [('f4', 2L)] item5 [('f5', 1L)] 我需要以以下形式扩展/重新设计数据框架 **item f1 f3 f4 f5** item1 item2

我有一个包含两列的pandas数据框:
item
value
value
列的值是元组列表,其中第一个元素是字段,第二个元素是计数

**item  value**
item1   
item2   
item3   [('f1', 10L), ('f3', 5L)]
item4   [('f4', 2L)]
item5   [('f5', 1L)]
我需要以以下形式扩展/重新设计数据框架

**item  f1  f3  f4  f5**
item1               
item2               
item3   10  5       
item4           2   
item5               1

pandas中是否有可以快速执行此操作的函数?

由于列表和np.nan的类型是混合的,这是不可编辑的,因此可以执行类型检查,如果值是列表元组,则在将其转换为字典后调用其上的pd.Series,否则构造空的Series对象:


考虑这种数据争用,它通过分离数据和非数据,然后将它们与透视表连接在一起,从而建立一个字典列表。这可能更适用于任何数量和组合的
f
类型:

import numpy as np
import pandas as pd

df = pd.DataFrame({'item':['item1', 'item2', 'item3', 'item4', 'item5'],
                   'value':['', '', [('f1', 10), ('f3', 5)], [('f4', 2)], [('f5', 1)]]})

# ACTUAL DATA
data = [{'fcols': i[0], 'value': i[1], 'item': row['item']}
        for ix, row in df.iterrows() if len(row['value']) > 0 for i in row['value']]
newdf = pd.DataFrame(data).pivot_table(index='item', values='value', columns='fcols').reset_index()

# NON-DATA
fcols = [i[0] for f in df['value'].tolist() if len(f) > 0 for i in f]
nondata = [{'value': np.nan, 'item': row['item'], 'fcols':f}
           for ix, row in df.iterrows() if row['value'] == '' for f in fcols]     
nondf = pd.DataFrame(nondata).pivot_table(index='item', values='value', columns='fcols').reset_index()

# COMBINED DF
newdf = pd.concat([nondf,newdf]).rename_axis(None, axis=1).reset_index(drop=True)

print(newdf)

#     item    f1   f3   f4   f5
# 0  item1   NaN  NaN  NaN  NaN
# 1  item2   NaN  NaN  NaN  NaN
# 2  item3  10.0  5.0  NaN  NaN
# 3  item4   NaN  NaN  2.0  NaN
# 4  item5   NaN  NaN  NaN  1.0

OP可能需要更广义的解决方案。可能会有比简单的post更多的值和项目。@Parfait这是可能的。我会等OP澄清。没错,还有更多的价值。我原来帖子中的那个只是一个玩具例子。那么这些价值观是什么呢?string/numeric/iterable?@Psidom,谢谢。我更改了值类型并使用空列表启动。这对我有用。
import numpy as np
import pandas as pd

df = pd.DataFrame({'item':['item1', 'item2', 'item3', 'item4', 'item5'],
                   'value':['', '', [('f1', 10), ('f3', 5)], [('f4', 2)], [('f5', 1)]]})

# ACTUAL DATA
data = [{'fcols': i[0], 'value': i[1], 'item': row['item']}
        for ix, row in df.iterrows() if len(row['value']) > 0 for i in row['value']]
newdf = pd.DataFrame(data).pivot_table(index='item', values='value', columns='fcols').reset_index()

# NON-DATA
fcols = [i[0] for f in df['value'].tolist() if len(f) > 0 for i in f]
nondata = [{'value': np.nan, 'item': row['item'], 'fcols':f}
           for ix, row in df.iterrows() if row['value'] == '' for f in fcols]     
nondf = pd.DataFrame(nondata).pivot_table(index='item', values='value', columns='fcols').reset_index()

# COMBINED DF
newdf = pd.concat([nondf,newdf]).rename_axis(None, axis=1).reset_index(drop=True)

print(newdf)

#     item    f1   f3   f4   f5
# 0  item1   NaN  NaN  NaN  NaN
# 1  item2   NaN  NaN  NaN  NaN
# 2  item3  10.0  5.0  NaN  NaN
# 3  item4   NaN  NaN  2.0  NaN
# 4  item5   NaN  NaN  NaN  1.0