python - 将 Pandas 中的行合并为一长行

标签 python pandas group-by

我有以下示例 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/

相关文章:

python - 按一列分组并在 Pandas 中找到另一列的总和和最大值

python - 如何根据同一元素中的另一个值搜索字典列表中元素的值?

python - Pandas 将函数应用于列的每隔一行

sql - 查找不同日期购买的同一商品

SQL - 根据列值选择行

python - Pandas 中的累积总和从零开始,以除最后一个条目以外的所有组的总和结束

python - numpy 中许多向量的优雅成对标量积

python - 如果没有使用简单的 cron 作业运行/停止/错误,请重新启动 python 脚本

python - 用于解码 RNN 输出的波束搜索算法

python - 使用开始日期和结束日期进行左连接