Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从一个具有多个索引列的csv中获取两个数据帧_Python_Pandas - Fatal编程技术网

Python 如何从一个具有多个索引列的csv中获取两个数据帧

Python 如何从一个具有多个索引列的csv中获取两个数据帧,python,pandas,Python,Pandas,我有这样一个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.002204166666

我有这样一个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, ...
并且希望有一个只有一条时间“线”的单一数据帧

其想法是创建两个数据帧,并使用resp to column 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:“时间”

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

我发现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
              ...                    ...

我有一个更简单的建议,使用:

  • 将csv与您感兴趣的列一起读取到单个数据框中
  • 选择包含
    Time
    的列名称作为键,然后选择列名称 包含
    频道
    作为值
  • 如果需要,可以使用
    df.drop(“variable”,axis=1)
    来摆脱 melt创建的额外列
代码示例

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')

注意:我的答案是受一个:-)启发的。

如果所有列名称都是唯一的,并且
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')


我建议你问一个新问题,现在这是一个不同的问题,我不清楚你想要什么。@Peter-你需要两个数据帧吗?一个用于带时间列的模拟列,另一个用于带时间列的数字列?@jezrael没有一个帧可以,我只是对数字信号感兴趣,也许你可以看看我问题的下半部分。在这里,我输入了我的期望值。我的解决方案与您的类似,但我无法模拟您的第二个输出。因为
concat
按索引(此处按时间)对值进行排序,如果值不存在,则添加NaN。你能解释更多的wos是必要的排序时间吗?为什么
0.000302
是第一位?另外,如果有更多的列,那么所需的输出是什么?谢谢
#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