【问题标题】:How to get two dataframes from one csv with multiple index columns如何从具有多个索引列的一个 csv 中获取两个数据帧
【发布时间】:2017-12-31 20:03:04
【问题描述】:

我有一个这样的 CSV 文件:

Time [s],Channel 0-Analog, Time [s],Reset-Digital, Time [s],Channel 1-Digital, Time [s],Channel 2-Digital, Time [s],Channel 3-Digital
-0.002204166666667, 2048.000000000000000, -0.002204166666667, 1, -0.002204166666667, 0, -0.002204166666667, 1, -0.002204166666667, 1
-0.002204000000000, 2048.000000000000000, -0.001124000000000, 0, -0.001504666666667, 1, -0.001448500000000, 0, -0.000199666666667, 0
-0.002203833333333, 2048.000000000000000, -0.000000000000000, 1, 0.000301666666667, 0, 0.000841666666667, 1, 0.000056333333333, 1
-0.002203666666667, 2048.000000000000000, 0.000550833333333, 0, 0.000932000000000, 1, 0.003178666666667, 0, 0.002361000000000, 0
-0.002203500000000, 2048.000000000000000, 0.003259333333333, 1, 0.002538166666667, 0, 0.005142333333333, 1, 0.004062000000000, 1
-0.002203333333333, 2048.000000000000000, 0.005602833333333, 0, ...

并且希望有一个只有一次“行”的数据框。

这个想法是创建两个数据框并将它们合并为一个,分别对应列 Time [s]。所以我创建了那个序列。

df1 = pd.read_csv('untitled.csv',usecols=[2,3])
df2 = pd.read_csv('untitled.csv',usecols=[4,5])

merged = pd.merge(df1,df2,on=r'Time [s]')

但它没有工作。 KeyError: '时间 [s]'

/**************************************************** ******************************/

我发现 pandas 正在为重复的列添加编号。所以我像这样更改了我的代码。

df1 = pd.read_csv('untitled.csv',usecols=[2,3])
df2 = pd.read_csv('untitled.csv',usecols=[4,5])
df1.columns = df1.columns.str.strip('.123 ')
df2.columns = df2.columns.str.strip('.123 ')
merged =pd.merge(df1,df2,on=r'Time [s]',how='outer')
merged.set_index(r'Time [s]')

但现在我遇到的问题是索引只是针对没有 NaN 的元素进行排序。表示首先是两列都有数字的所有行,然后只有第一列没有 NaN,然后​​只有第二列没有 NaN。

           Reset-Digital  Channel 1-Digital
   Time [s]                                   
   -0.002204            1.0                0.0
   -0.001124            0.0                NaN
   -0.000000            1.0                NaN
    0.000551            0.0                NaN
              ...                  ...
   -0.001505            NaN                1.0
    0.000302            NaN                0.0
    0.000932            NaN                1.0
    0.002538            NaN                0.0
              ...                    ...

我需要这种格式的

           Reset-Digital  Channel 1-Digital
   Time [s]                                   
    0.000302            NaN                0.0
    0.000551            0.0                NaN
    0.000932            NaN                1.0
    0.002538            NaN                0.0
   -0.000000            1.0                NaN
   -0.001124            0.0                NaN
   -0.001505            NaN                1.0
   -0.002204            1.0                0.0
              ...                    ...

【问题讨论】:

  • 我建议你问一个新问题,这是一个不同的问题,我不清楚你想要什么。
  • @Peter - 您是否需要 2 个数据帧 - 一个用于 Analog 列和时间列,第二个用于数字列和 time 列?
  • @jezrael 没有一帧是好的,我只是对数字信号感兴趣

标签: python pandas


【解决方案1】:

我有一个更简单的建议,使用pd.melt

  • 将 csv 读取到包含您感兴趣的列的单个数据框中;
  • 选择包含Time作为键的列名,以及列名 包含Channel 作为值;
  • 如果你愿意,你可以使用df.drop("variable", axis=1)来摆脱 熔体创建的额外列。

代码示例

df = pd.read_csv('untitled.csv')
keys = [col for col in df.columns if col.startswith('Time')]
values = [col for col in df.columns if col.startswith('Channel')]
pd.melt(df, id_vars=values, value_vars=keys, value_name='Time')

注意:我的回答灵感来自this one :-)

【讨论】:

    【解决方案2】:

    如果所有列名都是唯一的并且Time 列是信号列的先前列,则解决方案有效:

    #get all columns with Digital text
    d = df.columns[df.columns.str.contains('Digital')]
    print (d)
    Index(['Reset-Digital', 'Channel 1-Digital', 'Channel 2-Digital',
           'Channel 3-Digital'],
          dtype='object')
    
    #get all previous columns (Time columns)
    #for new versions of pandas for Time columns are added 1,2..for no duplicates
    td = df.columns[df.columns.get_indexer(d) - 1]
    print(td)
    Index(['Time [s].1', 'Time [s].2', 'Time [s].3', 'Time [s].4'], dtype='object')
    

    #zip time and signal column and concat data
    df = pd.concat([df.set_index(x[0])[x[1]] for x in zip(td, d)], axis=1)
    print (df)
              Reset-Digital  Channel 1-Digital  Channel 2-Digital  \
    -0.002204            1.0                0.0                1.0   
    -0.001505            NaN                1.0                NaN   
    -0.001448            NaN                NaN                0.0   
    -0.001124            0.0                NaN                NaN   
    -0.000200            NaN                NaN                NaN   
    -0.000000            1.0                NaN                NaN   
     0.000056            NaN                NaN                NaN   
     0.000302            NaN                0.0                NaN   
     0.000551            0.0                NaN                NaN   
     0.000842            NaN                NaN                1.0   
     0.000932            NaN                1.0                NaN   
     0.002361            NaN                NaN                NaN   
     0.002538            NaN                0.0                NaN   
     0.003179            NaN                NaN                0.0   
     0.003259            1.0                NaN                NaN   
     0.004062            NaN                NaN                NaN   
     0.005142            NaN                NaN                1.0   
    
               Channel 3-Digital  
    -0.002204                1.0  
    -0.001505                NaN  
    -0.001448                NaN  
    -0.001124                NaN  
    -0.000200                0.0  
    -0.000000                NaN  
     0.000056                1.0  
     0.000302                NaN  
     0.000551                NaN  
     0.000842                NaN  
     0.000932                NaN  
     0.002361                0.0  
     0.002538                NaN  
     0.003179                NaN  
     0.003259                NaN  
     0.004062                1.0  
     0.005142                NaN  
    

    【讨论】:

    • 也许你可以看看我问题的下半部分。在那里我进入了我的期望。
    • 我的解决方案与您的类似,但我无法模拟您的第二个输出。因为concat 按索引(这里按时间)对值进行排序,如果值不存在则添加 NaN。你能解释更多的 wos 是必要的排序时间吗?为什么0.000302 是第一位的?此外,如果连接更多列,所需的输出是什么?谢谢。
    猜你喜欢
    • 2019-01-02
    • 2020-09-18
    • 2019-08-11
    • 2018-12-10
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多