python - 创建没有 NaN 的 pandas MultiIndex Dataframe

标签 python pandas dataframe

我觉得我从根本上错过了一些东西。我有一个像这样的 Pandas DataFrame:

df = pd.DataFrame(list(range(3)).T
df.columns = ['a.first', 'a.second', 'b']

#    a.first  a.second  b
# 0        0         1  2

我想创建一个多索引数据帧,我可以在其中使用 df.a、df.a.first 和 df.b。到目前为止我得到的是 str split 方法:

a.columns = a.columns.str.split('.', expand=True)
#        a            b
#    first  second  NaN
# 0      0       1    2

很明显 NaN 是一个问题,因为要访问值 b,需要调用 df.b[np.nan] ,这感觉显然是错误的。

从这里开始,我想到的所有解决方案都开始感觉像是解决方法,我迭代列并尝试用空字符串替换 NaN。我想一定有一种更直接的方法,因为我想这是一个很常见的问题,不是吗?

编辑:到目前为止想到的最不丑陋的解决方案如下:

def apply_multiindex(df, hier_sep='.'):
    depths = df.columns.str.split(hier_sep).map(len)
    add_hiers = max(depths)-depths
    df.columns = [column + hier_sep*add_hier[c]
                  for c, column in enumerate(df.columns)]
    df.columns = df.columns.str.split(hier_sep, expand=True)

apply_multiindex(a)
#        a          b
#    first  second  
# 0      0       1  2

我仍然期待一个更干净的解决方案:)

最佳答案

对于我来说,rename 缺少值,因为 fillna for MultiIndex 未实现:

df = pd.DataFrame([list(range(3))], columns = ['a.first', 'a.second', 'b'])
df.columns = df.columns.str.split('.', expand=True)

df = df.rename(columns = {np.nan:''})
print (df)
      a         b
  first second   
0     0      1  2

关于python - 创建没有 NaN 的 pandas MultiIndex Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58312083/

相关文章:

python - 循环和子流程中的列表,标准输出

python - 如何在 pandas groupby 中正确使用变量?

python - 将分类代码转换为分类值

python - 使用整数映射 Pandas Dataframe 中的字符串值

python - 根据 Pandas 中的条件连接多个值将单个列呈现为新列

python - InstalledAppFlow 自动获取授权码

python - 在单元测试期间全局禁用 joblib.memory 缓存

python - 在 Python 中从列表中打印

python - 嵌套 JSON 和 Pandas 规范化

python - 规范化数据框的列