如何在多索引数据框中附加列表

问题描述 投票:0回答:2

如何将列表附加到多索引 DataFrame 中的特定行?

index = [("s", "1"),("s", "2"),("s", "3"),("s", "4"),("s", "5"), ("c", "1"),("c", "2"),("c", "3"),("c", "4"),("c", "5")]
multi_index = pd.MultiIndex.from_tuples(index)
df = pd.DataFrame({"I1":[11,12,13,14,15,10,22,33,44,55],"I2":[0,1,2,3,4,5,1,1,1,1]}, index=multi_index)
df

这段代码的结果

        I1  I2
s   1   11  0
    2   12  1
    3   13  2
    4   14  3
    5   15  4
c   1   10  1
    2   22  1
    3   33  1
    4   44  1
    5   55  1

我想在 df.loc["s"].loc['In1'] 中附加列表 x = [16,17,18,19]

得到

        I1  I2
s   1   11  0
    2   12  1
    3   13  2
    4   14  3
    5   15  4
    6   16  NaN
    7   17  NaN
    8   18  NaN
    9   19  NaN
c   1   10  1
    2   22  1
    3   33  1
    4   44  1
    5   55  1


我该怎么做?

python pandas dataframe append multi-index
2个回答
0
投票

您可以使用

append()
函数向 DataFrame 添加新行。首先,用你想要附加的值创建一个新的 DataFrame,设置适当的 MultiIndex,然后将它附加到原始 DataFrame。

所以,如果我正确理解您的要求,以下是您需要的代码:

import pandas as pd

index = [("s", "1"),("s", "2"),("s", "3"),("s", "4"),("s", "5"), ("c", "1"),("c", "2"),("c", "3"),("c", "4"),("c", "5")]
multi_index = pd.MultiIndex.from_tuples(index)
df = pd.DataFrame({"I1":[11,12,13,14,15,10,22,33,44,55],"I2":[0,1,2,3,4,5,1,1,1,1]}, index=multi_index)

# Values to be appended
x = [16, 17, 18, 19]

# Create a new DataFrame with the values and appropriate MultiIndex
new_index = [("s", str(i)) for i in range(6, 6+len(x))]
new_multi_index = pd.MultiIndex.from_tuples(new_index)
new_df = pd.DataFrame({"I1": x, "I2": [None] * len(x)}, index=new_multi_index)

# Append the new DataFrame to the original one
result = df.append(new_df)

print(result)

希望以下是您需要的输出:

     I1    I2
s 1  11     0
  2  12     1
  3  13     2
  4  14     3
  5  15     4
c 1  10     5
  2  22     1
  3  33     1
  4  44     1
  5  55     1
s 6  16  None
  7  17  None
  8  18  None
  9  19  None

0
投票

使用

concat
的一个选项:

x = [16,17,18,19]

last_max = int(df.loc['s'].index.max())

tmp = pd.DataFrame({'I1': x})
tmp.index = (tmp.index+last_max).astype(str)

out = (pd.concat([df, pd.concat([tmp], keys='s')])
         .sort_index(level=0, sort_remaining=False, kind='stable')
      )

输出:

     I1   I2
c 1  10  5.0
  2  22  1.0
  3  33  1.0
  4  44  1.0
  5  55  1.0
s 1  11  0.0
  2  12  1.0
  3  13  2.0
  4  14  3.0
  5  15  4.0
  5  16  NaN
  6  17  NaN
  7  18  NaN
  8  19  NaN
© www.soinside.com 2019 - 2024. All rights reserved.