我有一个问题,切片数据与熊猫多索引与重复。
假设我有一张桌子(A和B是被告)
A B C
1 1 11
1 2 12
1 3 13
2 1 21
2 2 22
2 3 23
and so on
And to vectors
a = [1, 2, 3, 1, 2, 1, 2 ]
b = [3, 2, 1, 3, 2, 1, 3 ]
我想用一种方式将表切片,以返回向量c,其值与向量a和b中的指示数一致。
c = [13, 22, 31, 13, 22, 11, 23]
我脑子里唯一想到的就是转动这张桌子,然后得到:
A B1 B2 B3
1 11 12 13
2 21 22 23
3 31 32 33
将一个索引应用于A列,通过loc获得正确的行,然后用指示矩阵对每一行进行适当的列选择,并用累积和得到向量(用另一个切片)。我确信一定有更简单的方法去做,但我找不到合适的方法去做
发布于 2020-10-28 09:05:00
您可以通过使用a
和b
数组来创建一个新的MultiIndex
,然后使用reindex
来实现这一点:
样本数据
import pandas as pd
index = pd.MultiIndex.from_product([[1,2,3], [1,2,3]])
df = pd.DataFrame({"C": [11, 12, 13, 21, 22, 23, 31, 32, 33]}, index=index)
print(df) # dataframe with 2-level index and 1 column "C"
C
1 1 11
2 12
3 13
2 1 21
2 22
3 23
3 1 31
2 32
3 33
方法
a
和b
数组(MultiIndex
,将数据(或仅仅是感兴趣的列)对齐到这个新的索引a = [1, 2, 3, 1, 2, 1, 2 ]
b = [3, 2, 1, 3, 2, 1, 3 ]
new_index = pd.MultiIndex.from_arrays([a, b])
new_c = df["C"].reindex(new_index)
print(new_c.to_numpy())
[13 22 31 13 22 11 23]
方法2
您还可以将a
和b
数组压缩到一起,只需使用.loc
对数据进行切片:
# Select the rows specified by combinations of a, b; in column "C"
new_c = df.loc[zip(a, b), "C"]
print(new_c.to_numpy())
[13 22 31 13 22 11 23]
发布于 2020-10-28 09:37:53
一个选项是merge
pd.DataFrame({'A':a,'B':b}).merge(df, on=['A','B'], how='left')['C']
输出(注意,NaN
值对应于df
中数据不可用的地方):
0 13.0
1 22.0
2 NaN
3 13.0
4 22.0
5 11.0
6 23.0
Name: C, dtype: float64
https://stackoverflow.com/questions/64577660
复制相似问题