Python 在大熊猫中分解具有不同长度的列表
我有一个熊猫数据框,其中一列包含不同长度的列表。pandas中分解列表的解决方案都假定要分解的列表长度相同 这是我的df:Python 在大熊猫中分解具有不同长度的列表,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,其中一列包含不同长度的列表。pandas中分解列表的解决方案都假定要分解的列表长度相同 这是我的df: Dep Exp Fl-No Shared Codes 0 20:58 20:55 LX 736 [No shared codes] 1 21:23 20:55 LX 818 [Dummy, LH 5809] 2 21:27 21:00 JU 375 [No shared codes] 4 21:28
Dep Exp Fl-No Shared Codes
0 20:58 20:55 LX 736 [No shared codes]
1 21:23 20:55 LX 818 [Dummy, LH 5809]
2 21:27 21:00 JU 375 [No shared codes]
4 21:28 21:00 LX 770 [Dummy, SN 5102]
7 21:31 21:10 LX 1842 [Dummy, LH 5880, TP 8184, A3 1985]
这就是我想要的:
Dep Exp Fl-No Shared Codes
0 20:58 20:55 LX 736 No shared codes
1 21:23 20:55 LX 818 Dummy
1 21:23 20:55 LX 818 LH 5809
2 21:27 21:00 JU 375 No shared codes
4 21:28 21:00 LX 770 Dummy
4 21:28 21:00 LX 770 SN 5102
7 21:31 21:10 LX 1842 Dummy
7 21:31 21:10 LX 1842 LH 5880
7 21:31 21:10 LX 1842 TP 8184
7 21:31 21:10 LX 1842 A3 1985
有人有什么建议吗?使用
np.repeat
和np.hstack
的一种可能性:
print(df)
Dep Exp Fl-No Shared Codes
0 20:58 20:55 LX 736 [No shared codes]
1 21:23 20:55 LX 818 [Dummy, LH 5809]
2 21:27 21:00 JU 375 [No shared codes]
4 21:28 21:00 LX 770 [Dummy, SN 5102]
7 21:31 21:10 LX 1842 [Dummy, LH 5880, TP 8184, A3 1985]
x = df.iloc[:, :-1].values.repeat(df['Shared Codes'].apply(len), 0)
y = df['Shared Codes'].apply(pd.Series).stack().values.reshape(-1, 1)
out = pd.DataFrame(np.hstack((x, y)), columns=df.columns)
print(out)
Dep Exp Fl-No Shared Codes
0 20:58 20:55 LX 736 No shared codes
1 21:23 20:55 LX 818 Dummy
2 21:23 20:55 LX 818 LH 5809
3 21:27 21:00 JU 375 No shared codes
4 21:28 21:00 LX 770 Dummy
5 21:28 21:00 LX 770 SN 5102
6 21:31 21:10 LX 1842 Dummy
7 21:31 21:10 LX 1842 LH 5880
8 21:31 21:10 LX 1842 TP 8184
9 21:31 21:10 LX 1842 A3 1985
非常类似于@coldspeed。我采取了一些不同的步骤
s = df['Shared Codes']
i = np.arange(len(df)).repeat(s.str.len())
df.iloc[i, :-1].assign(**{'Shared Codes': np.concatenate(s.values)})
Dep Exp Fl-No Shared Codes
0 20:58 20:55 LX 736 No shared codes
1 21:23 20:55 LX 818 Dummy
1 21:23 20:55 LX 818 LH 5809
2 21:27 21:00 JU 375 No shared codes
4 21:28 21:00 LX 770 Dummy
4 21:28 21:00 LX 770 SN 5102
7 21:31 21:10 LX 1842 Dummy
7 21:31 21:10 LX 1842 LH 5880
7 21:31 21:10 LX 1842 TP 8184
7 21:31 21:10 LX 1842 A3 1985
好的,我会再次发布更多信息和其他genius解决方案,请检查并
此外,使用
pd.wide\u to_long
但是,个人不建议导致过度杀戮
df1=df['Shared Codes'].apply(pd.Series)
df1.columns='sur'+df1.columns.astype(str)
df=pd.concat([df,df1],axis=1)
pd.wide_to_long(df,['sur'],['Dep','Exp','Fl-No'],'lol').reset_index().drop(['lol','Shared Codes'],axis=1).dropna()
Dep Exp Fl-No Shared Codes
0 20:58 20:55 LX 736 No shared codes
1 21:23 20:55 LX 818 Dummy
2 21:23 20:55 LX 818 LH 5809
3 21:27 21:00 JU 375 No shared codes
4 21:28 21:00 LX 770 Dummy
5 21:28 21:00 LX 770 SN 5102
6 21:31 21:10 LX 1842 Dummy
7 21:31 21:10 LX 1842 LH 5880
8 21:31 21:10 LX 1842 TP 8184
9 21:31 21:10 LX 1842 A3 1985
熊猫>=0.25 df:
Name Data
0 Bar [Product, Item, X]
1 Foo [Product, Misc]
df = df.explode('Data')
Name Data
0 Bar Product
0 Bar Item
0 Bar X
1 Foo Product
1 Foo Misc
使用Explode:
Name Data
0 Bar [Product, Item, X]
1 Foo [Product, Misc]
df = df.explode('Data')
Name Data
0 Bar Product
0 Bar Item
0 Bar X
1 Foo Product
1 Foo Misc
df:
Name Data
0 Bar [Product, Item, X]
1 Foo [Product, Misc]
df = df.explode('Data')
Name Data
0 Bar Product
0 Bar Item
0 Bar X
1 Foo Product
1 Foo Misc
@我认为OP不能在这里使用从宽到长的
。数据格式不正确。@Wen实际上我错了。我找到了一种从宽到长的方法,但它太糟糕了,不值得放。@cᴏʟᴅsᴘᴇᴇᴅ “皮尔的答案怎么样?”我投了更高的票。为什么?@cᴏʟᴅsᴘᴇᴇᴅ 我真的希望pandas能够记录下其中一个解决方案,并将其命名为unlify
似乎np。无论你选择哪条路线,重复都是必要的。这是我得到它时真正感到满意的几个解决方案之一。@cᴏʟᴅsᴘᴇᴇᴅdf.set_index(['Dep'、'Exp'、'Fl-No'])['Shared Codes']。apply(pd.Series).stack().reset_index().drop('level_3',1)
另一个类似的问题链接@cᴏʟᴅsᴘᴇᴇᴅ 发布~:)@BarJacks还不算太晚。请接受答复。