操纵熊猫数据框以显示所需的输出

时间:2018-09-05 14:57:14

标签: python pandas

我具有以下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。

5 个答案:

答案 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)

使用extractalljoin

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