我有以下示例 DF
import pandas as pd
import numpy as np
# Create a range of timestamps for 100 consecutive days starting from today
timestamps = pd.date_range(start=pd.Timestamp.now().floor('H'), periods=100, freq='H')
# Create a DataFrame with 100 rows and 3 columns
df = pd.DataFrame({'timestamp': timestamps,
# 'value1': np.random.randn(100),
# 'value2': np.random.randint(0, 10, 100)})
'value1': 'abc', 'value2': 'def'})
# Group the rows by day and apply a custom function that concatenates values
df = df.groupby(df['timestamp'].dt.date).agg({'timestamp': 'first',
'value1': lambda x: ', '.join(x),
'value2': lambda x: ', '.join(x),
}).reset_index(drop=True)
print(df.head())
现在我在创建数据帧时注释掉了 value1 和 value2,以尝试首先使用字符串来执行此操作。最终我需要它与 float 一起工作。现在,它将字符串组合成一列中的一个长逗号分隔字符串,我想这离我想要的又近了一小步。
我想要实现的是创建一个 DF,它将 1 天的所有行合并为一个大行,并重命名列名称,因此列应如下所示:timestamp、value1_00、value2_00、value1_01、value2_01, ...,值2_23
现在我已经尝试了一点,但是因为我对 pandas 还很陌生,所以我不完全确定从哪里开始,解决这个问题的一个好的开始是什么?我正在考虑的一件事是创建一个小 for 循环来创建新列,因为这可以是一个简单的循环,例如:
for i in range(0,24):
if i < 10:
new_column1 = 'value1_0' + str(i)
new_column2 = 'value2_0' + str(i)
new_columns = [new_column1, new_column2]
df[new_columns] = np.nan
else:
new_column1 = 'value1_' + str(i)
new_column2 = 'value2_' + str(i)
new_columns = [new_column1, new_column2]
df[new_columns] = np.nan
但是我如何将正确的值添加到正确的新列中?我确信可以通过创建几个函数来完成,但肯定有更方便的方法!
最佳答案
IIUC,您可以使用pivot
:
df = pd.DataFrame({'timestamp': timestamps, 'value1': 'abc', 'value2': 'def'})
out = (df.assign(date= df['timestamp'].dt.date, hour= df['timestamp'].dt.hour)
.pivot(index='date', columns='hour', values=['value1', 'value2']))
out.columns = [f'{col[0]}_{col[1]:02d}' for col in out.columns]
out = out.reset_index()
输出:
print(out)
date value1_00 value1_01 ... value2_21 value2_22 value2_23
0 2023-04-14 NaN NaN ... NaN NaN def
1 2023-04-15 abc abc ... def def def
2 2023-04-16 abc abc ... def def def
3 2023-04-17 abc abc ... def def def
4 2023-04-18 abc abc ... def def def
5 2023-04-19 abc abc ... NaN NaN NaN
[6 rows x 49 columns]
关于python - 将 Pandas 中的行合并为一长行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76018703/