gpt4 book ai didi

python - 使用一列列表对数据框重新采样

转载 作者:太空宇宙 更新时间:2023-11-04 01:51:46 25 4
gpt4 key购买 nike

尝试对 pandas 中的数据框进行重新采样。我在输入中收到这样的 .csv(数据列中的列表采用字符串形式):`

Name,Timestamp,Data
A1,5.26,"[1.0,1.2,1.9]"
A1,5.28,"[1.8,2.1,3.9]"
A1,5.30,"[1.2,1.4,0.9]"
A1,5.32,"[...]"
...
A2,5.26,"[...]"
A2,5.28,"[...]"
A2,5.30,"[...]"
A2,5.32,"[...]"
...
A3,5.26,"[...]"
A3,5.28,"[...]"
A3,5.30,"[...]"
A3,5.32,"[...]"`

数据以 50hz(因此每 20ms)记录一次。我想重新采样 25hz(所以每 40ms)。

我将数据列从字符串转换为实际列表

df['Data'] = df['Data'].apply(ast.literal_eval)

时间戳以秒为单位:

df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='s')

我知道我必须使用 .resample() 函数所以我尝试了

df.groupby('Name').resample("40L", on='Timestamp')

它没有给我错误,但它似乎根本没有重新采样,事实上我有相同数量的行和相同的数据,只是时间戳列转换为日期时间(如果我添加一个 .mean() 在 resample 函数结束后它给我错误 No numeric types to aggregate)。

我希望重采样后我的表看起来像:

Name Timestamp  Data
A1 5.26 [...]
A1 5.30 [...]
...
A2 5.26 [...]
A2 5.30 [...]
...
A3 5.26 [...]
A3 5.30 [...]

我该怎么办?

最佳答案

您的问题是将数据部分转换为实际的数字数据。 ast.literal_eval 不会削减它,因为您不能对 list 执行算术运算。这是我会做的:

df = pd.read_csv('your.csv')
df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='s')

df = df.join(df['Data'].str[1:-1]
.str.split(',', expand=True)
.astype(float)
)

# resample
df.groupby('Name').resample('40L', on='Timestamp').mean()

之后,您的 df 将类似于:

                                0     1    2
Name Timestamp
A1 1970-01-01 00:00:05.240 1.0 1.20 1.9
1970-01-01 00:00:05.280 1.5 1.75 2.4
1970-01-01 00:00:05.320 1.4 1.65 2.9
1970-01-01 00:00:05.360 1.5 1.75 2.4
1970-01-01 00:00:05.400 1.2 1.40 0.9
A2 1970-01-01 00:00:05.240 1.0 1.20 1.9
1970-01-01 00:00:05.280 1.5 1.75 2.4
1970-01-01 00:00:05.320 1.4 1.65 2.9
1970-01-01 00:00:05.360 1.5 1.75 2.4
1970-01-01 00:00:05.400 1.2 1.40 0.9

关于python - 使用一列列表对数据框重新采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57872277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com