【问题标题】:Iterating over multiIndex dataframe迭代 multiIndex 数据帧
【发布时间】:2016-09-10 13:30:25
【问题描述】:

我有一个如下图所示的数据框

我在遍历行时遇到问题。对于获取的每一行,我想返回键值。例如,在 2016-08-31 00:00:01 条目的第二行中,df1 & df3 的罗盘值是 4.0,所以我想返回具有相同罗盘值的键,即 df1 & df3在这种情况下 我一直在使用

迭代行
for index,row in df.iterrows():

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    更新

    好的,现在我更好地理解了您的问题,这对您有用。 首先使用

    更改数据框的形状
    dfs = df.stack().swaplevel(axis=0)
    

    这将使您的数据框看起来像:

    然后您可以像以前一样迭代行并提取您想要的信息。我只是对所有内容都使用 print 语句,但您可以将其放入一些更合适的数据结构中。

    for index, row in dfs.iterrows():
         dup_filter = row.duplicated(keep=False)
         dfss = row_tuple[dup_filter].index.values
         print("Attribute:", index[0])
         print("Index:", index[1])
         print("Matches:", dfss, "\n")
    

    会打印出类似的东西

    .....
    
    Attribute: compass
    Index: 5
    Matches: ['df1' 'df3']
    
    Attribute: gyro
    Index: 5
    Matches: ['df1' 'df3']
    
    Attribute: accel
    Index: 6
    Matches: ['df1' 'df3']
    
    ....
    

    你也可以一次只做一个属性

    dfs_compass = df.stack().swaplevel(axis=0).loc['compass']

    并仅使用索引遍历行。

    旧

    如果我正确理解您的问题,即您想要返回在列的第二级具有匹配值的行的索引,即('compass'、'accel'、'gyro')。以下将起作用。

    compass_match_indexes = []
    
    for index, row in df.iterrows():
        match_filter = row[:, 'compass'].duplicated()
        if len(row[:, 'compass'][match_filter] > 0)
            compass_match_indexes.append(index)
    

    您可以使用 df.loc[compass_match_indexes] 等列表选择您的数据框

    --

    另一种方法,您可以使用 df.T 对 DataFrame 进行转换,然后使用 duplicated 函数。

    【讨论】:

    • 感谢您的回答。实际上我想返回键而不是索引。就像上图中的第 1 行一样,我想返回 df1 和 df3,因为它们具有相同的罗盘值。我无法获取数据帧的 multiIndex 中的键。 @乔什
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2019-04-23
    • 2020-10-11
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多