根据另外2个列表对齐2个python列表

时间:2017-02-04 15:26:04

标签: python

我有两个数组,即 nlxTTL ttlState 。两个阵列都包含0和1的重复模式,表示输入电压可以是HIGH(1)或LOW(0),并从相同的源记录,发送TTL脉冲(HIGH和LOW),脉冲宽度为1秒。

但由于某些日志记录错误,在 ttlState 列表中会发生一些丢弃,即它不会记录0和1的重复序列,最终会丢弃值。

好的部分是我还记录了两个列表收到的每个TTL输入的时间戳。 Inter TTL事件时间戳差异清楚地表明TTL事件已经错过了其中一个脉冲。

以下是数据的示例:

nlxTTL, ttlState, nlxTime, ttlTime
0,0,1000,1000
1,1,2000,2000
0,1,3000,4000
1,1,4000,6000
0,0,5000,7000
1,1,6000,8000
0,0,7000,9000
1,1,8000,10000

正如您所看到的, nlxTime ttlTime 显然彼此不同。那么如何使用这些时间戳我可以对齐所有4个列表?

1 个答案:

答案 0 :(得分:4)

在处理CSV文件等表格数据时,最好使用库来简化流程。我喜欢pandas数据框库。

现在针对您的问题,考虑这个问题的一种方法是您确实有两个数据集...一个nlx数据集和一个ttl数据集。您希望通过时间戳将这些数据集连接在一起。熊猫使这样的任务变得非常容易。

import pandas as pd
from StringIO import StringIO

data = """\
nlxTTL, ttlState, nlxTime, ttlTime
0,0,1000,1000
1,1,2000,2000
0,1,3000,4000
1,1,4000,6000
0,0,5000,7000
1,1,6000,8000
0,0,7000,9000
1,1,8000,10000
"""

# Load data into dataframe.
df = pd.read_csv(StringIO(data))

# Remove spaces from column names.
df.columns = [x.strip() for x in df.columns]

# Split the data into an nlx dataframe and a ttl dataframe.
nlx = df[['nlxTTL', 'nlxTime']].reset_index()
ttl = df[['ttlState', 'ttlTime']].reset_index()

# Merge the dataframes back together based on their timestamps.
# Use an outer join so missing data gets filled with NaNs instead
# of just dropping the rows.
merged_df = nlx.merge(ttl, left_on='nlxTime', right_on='ttlTime', how='outer')

# Get back to the original set of columns
merged_df = merged_df[df.columns]

# Print out the results.
print(merged_df)

这会产生以下输出。

   nlxTTL  ttlState  nlxTime  ttlTime
0     0.0       0.0   1000.0   1000.0
1     1.0       1.0   2000.0   2000.0
2     0.0       NaN   3000.0      NaN
3     1.0       1.0   4000.0   4000.0
4     0.0       NaN   5000.0      NaN
5     1.0       1.0   6000.0   6000.0
6     0.0       0.0   7000.0   7000.0
7     1.0       1.0   8000.0   8000.0
8     NaN       0.0      NaN   9000.0
9     NaN       1.0      NaN  10000.0

您会注意到它会使用NaN值填充已删除的值,因为我们正在进行外部联接。如果不合需要,请将how='outer'参数更改为how='inner'以执行内部联接。这将只保留在该时间戳上同时具有nlx和ttl响应的记录。