Python 如何从一个具有多个索引列的csv中获取两个数据帧
我有这样一个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
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
作为值李>频道
- 如果需要,可以使用
来摆脱 melt创建的额外列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')
注意:我的答案是受一个:-)启发的。如果所有列名称都是唯一的,并且
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