[英]Conditional Slicing from Columns in Pandas MultiIndex
我正在嘗試根據列名而不是索引有條件地從多索引中切片數據。 例如,我有以下 MultiIndex 數據框:
203 204 205
TIME VALUE TIME VALUE TIME VALUE
0 1 bar 1.0 LH2 10.0 dog
1 2 baz 2.0 LOX 11.0 cat
2 3 foo 3.0 CH4 12.0 pig
3 4 qux NaN NaN 13.0 rat
4 5 qaz NaN NaN NaN NaN
5 6 qoo NaN NaN NaN NaN
(我基本上有帶有時間和值的測量數據(203、204 等),使用不同的采樣率記錄。因此,行數總是不同的。我將所有數據放入一個 MultiIndex,因為它可以包含一個不同的行數。)
如果 TIME > 3,我想選擇所有數據。預期的輸出如下:
203 204 205
TIME VALUE TIME VALUE TIME VALUE
0 4 qux NaN NaN 10.0 dog
1 5 qaz NaN NaN 11.0 cat
2 6 qoo NaN NaN 12.0 pig
3 NaN NaN NaN NaN 13.0 rat
4 NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN
我嘗試使用查詢方法,但這只適用於索引,而不適用於列名。 我不想轉置數據框以使用查詢。 我也嘗試使用 loc 但似乎從未找到一種方法來獲得我正在尋找的東西。 我什至考慮使用 xs 但我認為我不能用它添加條件切片。
我在 SO 上找到了這個,但它不包括條件切片: 從熊貓 MultiIndex 中選擇列
這是我用來測試的代碼:
import pandas as pd
import numpy as np
d1 = {'TIME': [1,2,3,4,5,6], 'VALUE': ['bar', 'baz', 'foo', 'qux', 'qaz', 'qoo']}
df1 = pd.DataFrame(data=d1)
d2 = {'TIME': [1,2,3], 'VALUE': ['LH2', 'LOX', 'CH4']}
df2 = pd.DataFrame(data=d2)
d3 = {'TIME': [10,11,12,13], 'VALUE': ['dog', 'cat', 'pig', 'rat']}
df3 = pd.DataFrame(data=d3)
df_list = [df1, df2, df3]
pids = [203, 204, 205]
df_multi = pd.concat(df_list, axis=1, keys=list(zip(pids)))
print(df_multi)
# Slice all time columns
ALL = slice(None)
df_multi_2 = df_multi.loc[ALL, (ALL, 'TIME')]
print(df_multi_2)
# Condition based slicing - does not work
ALL = slice(None)
df_multi_3 = df_multi.loc[ALL, df_multi.loc[ALL,(ALL,'TIME')] > 3]
print(df_multi_3)
讓我們嘗試使用IndexSlice
對數據進行切片:
from pandas import IndexSlice
mask = (df_multi.loc[:, IndexSlice[:,"TIME"]].gt(3)
.reindex(df_multi.columns, axis=1)
.groupby(level=0, axis=1)
.transform('any')
)
df_multi.where(mask)
輸出:
203 204 205
TIME VALUE TIME VALUE TIME VALUE
0 NaN NaN NaN NaN 10.0 dog
1 NaN NaN NaN NaN 11.0 cat
2 NaN NaN NaN NaN 12.0 pig
3 4.0 qux NaN NaN 13.0 rat
4 5.0 qaz NaN NaN NaN NaN
5 6.0 qoo NaN NaN NaN NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.