【问题标题】:Converting or rotating the csv into a specific format in python在python中将csv转换或旋转为特定格式
【发布时间】:2021-08-17 03:21:11
【问题描述】:

我有一个这样的 csv 文件:

    ,,22-5-2021 (v_c) , 23-5-2021 (v_c)
    col_a,col_b,v_c,v_d,v_c,v_d
    1,1,2,4,5,6
    2,2,2,3,7,6
    3,3,2,5,6,5

我需要将其转换为:

col_a,col_b,v_c,v_d,dates
1,1,2,4,22-5-2021
1,1,5,6,23-5-2021
2,2,2,3,22-5-2021
2,2,7,6,23-5-2021
3,3,2,5,22-5-2021
3,3,6,5,23-5-2021

col_a,col_b,v_c,v_d,dates
1,1,2,4,22-5-2021
2,2,2,3,22-5-2021
3,3,2,5,22-5-2021
1,1,5,6,23-5-2021
2,2,7,6,23-5-2021
3,3,6,5,23-5-2021

我的方法是使用 df.melt,但不太明白。也许我不知道如何为每列带来 2 列的日期。

【问题讨论】:

  • 先生,您的问题解决了吗?

标签: python excel pandas dataframe csv


【解决方案1】:

你可以尝试通过列表理解+pd.wide_to_long():

df=pd.read_csv('etc.csv',header=1)
df.columns=[x if x.split('.')[-1].isnumeric() else x+'.0' for x in df]
df=(pd.wide_to_long(df,['v_c','v_d'],['col_a.0','col_b.0'],'drop',sep='.')
      .reset_index().sort_values('drop'))
df['dates']=df.pop('drop').map({0:'22-5-2021',1:'23-5-2021'})
df.columns=df.columns.str.rstrip('.0')

df的输出:

    col_a   col_b   v_c v_d dates
0   1       1       2   4   22-5-2021
2   2       2       2   3   22-5-2021
4   3       3       2   5   22-5-2021
1   1       1       5   6   23-5-2021
3   2       2       7   6   23-5-2021
5   3       3       6   5   23-5-2021

【讨论】:

  • 为什么我们要更改第 2 行的列名?有没有办法同时获取日期?
  • @LearnerJS 因为wide_to_long() 我们不这样做会抛出错误......如果你的日期很少,那么映射很容易......更新答案。 ..请看一下:)
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2019-02-01
相关资源
最近更新 更多