【问题标题】:Split pandas dataframe by column then append按列拆分熊猫数据框,然后追加
【发布时间】:2020-08-10 01:37:58
【问题描述】:

我有数据框:

我想保留前三列,然后将它们堆叠在接下来的 3 列之上,这样我就有了一个最后只有 ["userID", "tweetID", "time"] 的数据框。

【问题讨论】:

  • 请不要以图片的形式共享数据,而是以文本的形式共享数据,以便轻松复制。没有人愿意手写数据。此外,为了生成Minimal, Reproducible Example,请使用所需的输出编辑问题。
  • @AlexandreB。我将它作为图片分享,因为我认为它更容易可视化。此外,所需的输出位于问题的末尾。我只想获取名称以“_end”结尾的列并将它们堆叠在前 3 列下。
  • @Quubix,如果输入是文本的,那么 SO 助手会容易得多,因为可以将数据复制到正在运行的 python 解释器中。如果预期输出为文本,也可以通过代码与生成的输出进行比较。

标签: python pandas dataframe


【解决方案1】:

看来你需要pd.wide_to_long:

df.columns=df.columns.str.split('_').map(lambda x : '_'.join(x[::-1]))
s=pd.wide_to_long(df.reset_index(),['end','start'],i='index',j='drop',sep='_',suffix='\w+').stack().unstack(-2)

【讨论】:

  • 这不起作用:ValueError: Length mismatch: Expected 100 rows, received array of length 3
  • @Quubix 检查更新,这只是我的理解,如果仍然不符合您的需要,请包含预期输出
【解决方案2】:
start_cols = [c for c in df.columns if c.endswith('_start')]
end_cols = [c for c in df.columns if c.endswith('_end')]

def rename(x): return x.split('_')[0]

output_df = pd.concat([
    df[start_cols].rename(columns=rename), 
    df[end_cols].rename(columns=rename)
])

您可以对两个数据帧中的开始列和结束列进行子集化,并将它们 pd.concat 组合在一起以堆叠。

【讨论】:

    【解决方案3】:
    df_top = tree_df[['userID_start', 'tweetID_start', 'time_start']]
    df_top.columns = ['userID', 'tweetID', 'time']
    df_bottom = tree_df[['userID_end', 'tweetID_end', 'time_end']]
    df_bottom.columns = ['userID', 'tweetID', 'time']
    final_df = pd.concat([df_top, df_bottom])
    

    这行得通。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2020-04-21
      相关资源
      最近更新 更多