我认为这与post类似,但不完全相同,我无法理解它。
所以,我目前有一个(非常奇怪的)pandas数据帧,每个单元格中都有这样的列表:
>>> data = pd.DataFrame({'myid' : ['1', '2', '3'],
'num' : [['1', '2', '3'], ['1', '2'], []],
'text' : [['aa', 'bb', 'cc'], ['cc', 'dd'],
[]]}).set_index('myid')
>>> print(data)
num text
myid
1 [1, 2, 3] [aa, bb, cc]
2 [1, 2] [cc, dd]
3 [] []
我想实现这个目标:
myid num text
0 1 1 aa
0 1 2 bb
0 1 3 cc
1 2 1 cc
1 2 2 dd
2 3
我如何到达那里?
答案 0 :(得分:6)
我使用str.len
来确定嵌入列表/数组的长度。然后使用repeat
和concatenate
lens = df.num.str.len()
pd.DataFrame(dict(
myid=df.myid.repeat(lens),
num=np.concatenate(df.num),
text=np.concatenate(df.text)
)).append(
pd.DataFrame(
df.loc[~df.num.astype(bool), 'myid']
)
).fillna('')
myid num text
0 1 1 aa
0 1 2 bb
0 1 3 cc
1 2 1 cc
1 2 2 dd
2 3
答案 1 :(得分:2)
我在这里尝试基于brilliant @piRSquared's solution创建更通用的解决方案:
数据帧:
df = pd.DataFrame({
'aaa': {0: 10, 1: 11, 2: 12, 3: 13},
'myid': {0: 1, 1: 2, 2: 3, 3: 4},
'num': {0: [1, 2, 3], 1: [1, 2], 2: [], 3: []},
'text': {0: ['aa', 'bb', 'cc'], 1: ['cc', 'dd'], 2: [], 3: []}
})
解决方案:
lst_cols = ['num','text']
idx_cols = df.columns.difference(lst_cols)
lens = df[lst_cols[0]].str.len()
pd.DataFrame({
col:np.repeat(df[col].values, df[lst_cols[0]].str.len())
for col in idx_cols
}).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
.append(df.loc[lens==0, idx_cols]).fillna('') \
.loc[:, df.columns]
来源DF:
In [25]: df
Out[25]:
aaa myid num text
0 10 1 [1, 2, 3] [aa, bb, cc]
1 11 2 [1, 2] [cc, dd]
2 12 3 [] []
3 13 4 [] []
结果:
In [26]: pd.DataFrame({
...: col:np.repeat(df[col].values, df[lst_cols[0]].str.len())
...: for col in idx_cols
...: }).assign(**{col:np.concatenate(df[col].values) for col in lst_cols}) \
...: .append(df.loc[lens==0, idx_cols]).fillna('') \
...: .loc[:, df.columns]
...:
Out[26]:
aaa myid num text
0 10 1 1 aa
1 10 1 2 bb
2 10 1 3 cc
3 11 2 1 cc
4 11 2 2 dd
2 12 3
3 13 4