【问题标题】:Pandas - flattening a multiindex column containing tuples, but ignore missing valuesPandas - 展平包含元组的多索引列,但忽略缺失值
【发布时间】:2018-07-22 20:54:46
【问题描述】:

我有一个这样的多索引熊猫数据框:

lst = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (21, 22)]
df = pd.DataFrame(lst, pd.MultiIndex.from_product([['A', 'B'], ['1','2', '3', '4']])).loc[:('B', '2')]
df["tuple"] = list(zip(df[0], df[1]))

#df:
      0   1     tuple
A 1   1   2    (1, 2)
  2   3   4    (3, 4)
  3   5   6    (5, 6)
  4   7   8    (7, 8)
B 1   9  10   (9, 10)
  2  11  12  (11, 12)

我想将包含元组的列转换为元组列表。我的做法是:

#dataframe to append list of tuples
new_df = pd.DataFrame([1, 2], index = list("AB") )

#voila a list of tuples
new_df["list_of_tuples"] = df["tuple"].unstack(level = -1).values.tolist()

#new_df:
   0                 list_of_tuples
A  1     [(1, 2), (3, 4), (5, 6), (7, 8)]
B  2  [(9, 10), (11, 12), None, None]

这有效,但仅适用于每个条目长度相等的多索引数据帧。如果所有条目的长度不同,则缺少的列会在列表中产生None 值。我尝试在创建列表之前删除 numpy NaN 值,但失败了。有没有办法防止None 在最终的元组列表中出现?

【问题讨论】:

    标签: python python-3.x pandas multi-index


    【解决方案1】:

    这是你需要的吗?

    df.groupby(level=[0]).tuple.apply(list)
    Out[306]: 
    A    [(1, 2), (3, 4), (5, 6), (7, 8)]
    B                 [(9, 10), (11, 12)]
    Name: tuple, dtype: object
    

    【讨论】:

    • 嗯,这很尴尬。您的方法适用于我的玩具数据集。但是,尽管真正的数据框具有完全相同的结构(至少,我认为它具有),但它返回的“DataFrameGroupBy”对象没有属性“元组”。任何想法,无形的差异可能是什么?我能想到的唯一区别:我原来的多索引数据框是由 str.extractall(pairs) 操作创建的。
    • @Piinthesky df.groupby(level=[0])['tuple'].apply(list) 试试这个
    • 宾果游戏!我想,我应该付出一些努力并尝试了解groupby() 映射器是如何工作的。我微弱的尝试都失败了。非常感谢。
    • @Piinthesky yw~ :-) 一个提示,也许不要用 pandas 内置函数名称命名 para,例如 sum 、 max 、 tuple 、 list 、dict 等。如果是这样,您需要使用 df['Name'] 而不是 df.Name 来调用它(更容易调用):-) 快乐编码
    • 糟糕,不,这只是用来说明示例。真正的数据框列有一个完全不同的名称,与 pandas 内置函数无关。
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2015-06-10
    相关资源
    最近更新 更多