在pandas中重新设计数据帧

2024-03-28 14:07:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有两列的pandas数据帧:itemvaluevalue列的值是元组列表,其中第一个元素是字段,第二个元素是计数。你知道吗

**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

熊猫有什么功能可以快速完成吗?你知道吗


Tags: 数据元素pandasvaluef5itemf1元组
2条回答

因为你有混合类型的列表和np.nan公司如果值是列表元组,则调用pd系列将其转换为字典后,在其上创建一个空的序列对象:

import numpy as np
import pandas as pd
lst = [np.nan, np.nan, 
      [('f1', 10), ('f3', 5)], 
      [('f4', 2)], 
      [('f5', 1)]]

df = pd.DataFrame({"item": ["item"+str(i) for i in range(1,6)], "value": let})

pd.concat([df.item, df['value'].apply(lambda x: pd.Series(dict(x)) if type(x) == list else pd.Series([]))], axis = 1)

enter image description here

考虑一下这种数据争用,它通过分离数据和非数据,然后用透视表将它们连接在一起,从而建立一个字典列表。对于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

相关问题 更多 >