<p>考虑一下这种数据争用,它通过分离数据和非数据,然后用透视表将它们连接在一起,从而建立一个字典列表。对于<code>f</code>类型的任何数量和组合,这可能更具普遍性:</p>
<pre><code>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
</code></pre>