【问题标题】:Split a multi-index dataframe in dataframes by column names按列名拆分数据框中的多索引数据框
【发布时间】:2020-01-22 17:17:04
【问题描述】:

我有一个如下数据框: Multi-index dataframe by columns

我想获得 3 个数据帧,命名为每列(罗盘、加速度、陀螺仪),时间索引不变,每列三列(df1、df2、df3)。

我试过了 for index,row in df.iterrows(): 但不能真正让它工作 我在想stack()unstack(),但我真的不知道怎么做。

【问题讨论】:

标签: python pandas dataframe multi-index


【解决方案1】:

groupby 允许您沿具有相同 level_values 的 MultiIndex 级别拆分 DataFrame。我们将使用DataFrame.xs 删除分组索引级别,只留下您关心的列。单独的 DataFrame 存储在字典中,由原始列 MultiIndex 的唯一级别 1 值作为键。

样本数据

import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame(np.random.randint(1, 10, (4, 9)),
                  columns=pd.MultiIndex.from_product([['df1', 'df2', 'df3'],
                                                      ['compass', 'gyro', 'accel']]))
#      df1                df2                df3           
#  compass gyro accel compass gyro accel compass gyro accel
#0       3    3     7       2    4     7       2    1     2
#1       1    1     4       5    1     1       5    2     8
#2       4    3     5       8    3     5       9    1     8
#3       4    5     7       2    6     7       3    2     9

代码

d = {idx: gp.xs(idx, level=1, axis=1) for idx,gp in df.groupby(level=1, axis=1)}
d['gyro']
#   df1  df2  df3
#0    3    4    1
#1    1    1    2
#2    3    3    1
#3    5    6    2

由于groupby 很容易实现这样的拆分,您甚至可能不需要存储单独的 DataFrame;您可以使用GroupBy.apply 分别操作它们中的每一个。

【讨论】:

  • 谢谢!我试图让他们分开 csv 文件。我看看能不能用groupby.apply
  • @MrAce2C 然后在这种情况下,只需执行以下操作:for idx,gp in df.groupby(level=1, axis=1): gp.xs(idx, level=1, axis=1).to_csv(f'{idx}.csv') 不会将它们存储在字典中,而是会创建 3 个单独的 CSV 'gyro.csv'、'accel.csv' 和 'compass .csv'
【解决方案2】:

您可以将前 3 列保存在 csv 文件中,然后对其他 csv 文件重复以上过程 2 次...

您可以像这样选择数据框的 3 列:

x = 0
data=pd.read_csv(file.csv, keep_default_na=False, skiprows=line_header, na_filter=False, usecols=[x,x+1,x+2])[[compass, accel, gyro]])

其中 x =“大数据框”的第一列

usecols 属性在这种情况下非常有用

您可以阅读更多信息:Pandas.read_csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多