将列的列分解为多行

Mic*_*ner 6 python list dataframe pandas

我想将某个列中的列表(在示例column_x中)扩展为多行.

所以

df = pd.DataFrame({'column_a': ['a_1', 'a_2'], 
                   'column_b': ['b_1', 'b_2'], 
                   'column_x': [['c_1', 'c_2'], ['d_1', 'd_2']]
                  })
Run Code Online (Sandbox Code Playgroud)

应改变自己

    column_a    column_b    column_x
0   a_1         b_1         [c_1, c_2]
1   a_2         b_2         [d_1, d_2]
Run Code Online (Sandbox Code Playgroud)

    column_a    column_b    column_x
0   a_1         b_1         c_1
1   a_1         b_1         c_2
2   a_2         b_2         d_1
3   a_2         b_2         d_2
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所拥有的代码确实如此,而且它的速度很快.

lens = [len(item) for item in df['column_x']]
pd.DataFrame( {"column_a" : np.repeat(df['column_a'].values, lens), 
               "column_b" : np.repeat(df['column_b'].values, lens), 
               "column_x" : np.concatenate(df['column_x'].values)})
Run Code Online (Sandbox Code Playgroud)

但是,我有很多专栏.是否有一个整洁而优雅的解决方案来重复整个数据框而无需再次指定每一列?

cs9*_*s95 5

熊猫> = 0.25

熊猫可以通过进行单个函数调用df.explode

df.explode('column_x')

  column_a column_b column_x
0      a_1      b_1      c_1
0      a_1      b_1      c_2
1      a_2      b_2      d_1
1      a_2      b_2      d_2
Run Code Online (Sandbox Code Playgroud)

请注意,只能在一个列上爆炸Series / DataFrame。


熊猫<0.25

呼叫np.repeat沿0 ,每列轴之外 column_x

df1 = pd.DataFrame(
    df.drop('column_x', 1).values.repeat(df['column_x'].str.len(), axis=0),
    columns=df.columns.difference(['column_x'])
)
df1['column_x'] = np.concatenate(df['column_x'].values)

df1

  column_a column_b column_x
0      a_1      b_1      c_1
1      a_1      b_1      c_2
2      a_2      b_2      d_1
3      a_2      b_2      d_2
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 2

您可以重复索引值:

lens = df['column_x'].str.len()
a = np.repeat(df.index.values, lens)
print (a)
[0 0 1 1]

df = df.loc[a].assign(column_x=np.concatenate(df['column_x'].values)).reset_index(drop=True)
print (df)
  column_a column_b column_x
0      a_1      b_1      c_1
1      a_1      b_1      c_2
2      a_2      b_2      d_1
3      a_2      b_2      d_2
Run Code Online (Sandbox Code Playgroud)