我具有以下DataFrame结构:
profile_id user birthday
123, 124 test1 day1
131, 132 test2 day2
我需要显示的是:
profile_id user birthday
123 test1 day1
124 test1 day1
131 test2 day2
132 test2 day2
在profile_id列中,我有几个用逗号分隔的ID,我需要遍历每个ID。
答案 0 :(得分:3)
这是一种方法
In [1127]: dfs = (df.profile_id.str.split(', ', expand=True).stack()
.reset_index(name='profile_id'))
In [1128]: df.loc[dfs.level_0].assign(profile_id=dfs.profile_id)
Out[1128]:
profile_id user birthday
0 123 test1 day1
0 123 test1 day1
1 124 test2 day2
1 124 test2 day2
答案 1 :(得分:3)
您也可以结合使用concat()
和.melt()
:
>>> pd.concat((
... df['profile_id'].str.split(', ', expand=True),
... df.drop('profile_id', axis=1)), axis=1)\
... .melt(id_vars=['user', 'birthday'], value_name='profile_id')\
... .drop('variable', axis=1)
user birthday profile_id
0 test1 day1 123
1 test2 day2 131
2 test1 day1 124
3 test2 day2 132
答案 2 :(得分:2)
df.loc[df.index.repeat(df.profile_id.str.count(', ') + 1)].assign(
profile_id=', '.join(df.profile_id).split(', '))
profile_id user birthday
0 123 test1 day1
0 124 test1 day1
1 131 test2 day2
1 132 test2 day2
sep = ', '
idx = df.index.repeat(df.profile_id.str.count(sep) + 1)
new = sep.join(df.profile_id).split(sep)
df.loc[idx].assign(profile_id=new)
profile_id user birthday
0 123 test1 day1
0 124 test1 day1
1 131 test2 day2
1 132 test2 day2
loc
还可以获得新的索引
sep = ', '
col = 'profile_id'
p = df[col]
i = np.arange(len(df)).repeat(p.str.count(sep) + 1)
pd.DataFrame({
col: sep.join(p).split(sep),
**{c: df[c].values[i] for c in df if c != col}
}, columns=df.columns)
profile_id user birthday
0 123 test1 day1
1 124 test1 day1
2 131 test2 day2
3 132 test2 day2
答案 3 :(得分:2)
df.profile_id.str.split(",",expand=True).set_index(a.user).stack().reset_index(level=1, drop=True).reset_index().rename(columns={0:"profile_id"})
答案 4 :(得分:2)
使用extractall
和join
:
df.join(
df.pop('profile_id').str.extractall(r'(\d+)').reset_index(1, drop=True)
).rename(columns={0: 'profile_id'})
user birthday profile_id
0 test1 day1 123
0 test1 day1 124
1 test2 day2 131
1 test2 day2 132