我有一个包含几列的数据框,其中包含一个列表。我想将此列表拆分为不同的列。目前,我在stackoverflow中发现了this问题,但似乎只是将列表拆分为1列,我想将其应用于列表中对象数目不相等的多列。
我的df看起来像这样:
ID | value_0 | value_1 | value_2 | value_3 | value_4
0 1001|[1001,1002]| None | None | None | None
1 1010|[1010,2001]|[2526,1000]| None | None | None
2 1100|[1234,5678]|[9101,1121]|[3141,5161]|[1718,1920]|[2122,2324]
我想将其转换为:
ID | 0 | 1 | 2 | 3 | 4
0 1001|1001|1002| None | None | None
1 1010|1010|2001| 2526 | 1000 | None
2 1100|1234|5678| 9101 | 1121 | 3141 ....etc.
当前这是我的代码,但是它仅输出包含“ None”值的数据帧。我不确定如何解决它,因为它似乎只获得最后一列,而没有真正拆分列表。
length = len(list(df.columns.values))-1
for i in range(length):
temp = "value_" + str(i)
x = df[temp]
new_df = pd.DataFrame(df[temp].values.tolist())
我得到的new_df结果是:
| 0
0| None
1| None
2| [2122,2324]
但是,如果我只关注1列(即value_0),则可以很好地拆分列表。
new_df = pd.DataFrame(df['value_0'].values.tolist())
非常感谢您的帮助
答案 0 :(得分:0)
想法是通过DataFrame.stack
重塑值以删除None
值,因此可以使用DataFrame
构造函数,然后通过Series.unstack
重塑形状,对列进行排序并设置默认列名:
import ast
#if strings in columns instead lists
#df.iloc[:, 1:] = df.iloc[:, 1:].applymap(ast.literal_eval)
s = df.set_index('ID', append=True).stack()
df = pd.DataFrame(s.values.tolist(), index=s.index).unstack().sort_index(axis=1, level=1)
df.columns = np.arange(len(df.columns))
df = df.reset_index(level=1)
print (df)
ID 0 1 2 3 4 5 6 7 \
0 1001 1001.0 1002.0 NaN NaN NaN NaN NaN NaN
1 1010 1010.0 2001.0 2526.0 1000.0 NaN NaN NaN NaN
2 1100 1234.0 5678.0 9101.0 1121.0 3141.0 5161.0 1718.0 1920.0
8 9
0 NaN NaN
1 NaN NaN
2 2122.0 2324.0
0.24+大熊猫缺失整数值的解决方案:
df = df.astype('Int64').reset_index(level=1)
print (df)
ID 0 1 2 3 4 5 6 7 8 9
0 1001 1001 1002 NaN NaN NaN NaN NaN NaN NaN NaN
1 1010 1010 2001 2526 1000 NaN NaN NaN NaN NaN NaN
2 1100 1234 5678 9101 1121 3141 5161 1718 1920 2122 2324
答案 1 :(得分:0)
首先使用pd.concat
和pd.Series
将列表扩展到单独的列中并追加到原始df中,然后仅删除原始列
for i in df.columns:
df = pd.concat([df, df[i].apply(pd.Series)], axis=1)
df.drop(['ID','value_0','value_1','value_2','value_3','value_4'], axis=1, inpalce=True)
输出
0 0 1 0 1 0 1 0 1 \
0 1001 1001 1002 NaN NaN NaN NaN NaN NaN
1 1010 1010 2001 2526.0 1000.0 NaN NaN NaN NaN
2 1100 1234 5678 9101.0 1121.0 3141.0 5161.0 1718.0 1920.0
0 1
0 NaN NaN
1 NaN NaN
2 2122.0 2324.0