Python Pandas 分层(元组)行索引——如何select 所有中间行?
Python Pandas hierarchical (tuple) row indexing -- how to select all of an intermediate row?
考虑以下代码:
row1 = [(2,2), (4,4)]
row2 = [(5,5)]
row3 = [10, 20, 30, 40]
row_tuple_list = []
for r1 in row1:
for r2 in row2:
for r3 in row3:
row_tuple_list.append((r1, r2, r3))
row_index = pd.MultiIndex.from_tuples(row_tuple_list, names=['row1', 'row2', 'row3'])
col1 = ['f', 'i']
col2 = ['g', 'h']
col_tuple_list = []
for c1 in col1:
for c2 in col2:
col_tuple_list.append((c1, c2))
col_index = pd.MultiIndex.from_tuples(col_tuple_list, names=['col1', 'col2'])
df = pd.DataFrame(index=row_index, columns=col_index)
生成数据帧:
col1 f i
col2 g h g h
row1 row2 row3
(2, 2) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
(4, 4) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
现在,我想设置此数据框的各个元素。例如,
w=(2,2)
x=(5,5)
y=10
df.loc[(w,x,y),('f','g')] = 200
print(df)
给出:
col1 f i
col2 g h g h
row1 row2 row3
(2, 2) (5, 5) 10 200 NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
(4, 4) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
有没有办法在不显式设置第二行值的情况下执行此操作(因为我知道第 1 行和第 2 行以相同的频率出现)?
我试过了:
df.loc[(w,slice(None),y),('f','g')] =100
失败了。
# you need to use slice for w as well. This should work.
df.loc[(slice(w),slice(None),y),('f','g')]
df
Out[208]:
col1 f i
col2 g h g h
row1 row2 row3
(2, 2) (5, 5) 10 100 NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
(4, 4) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
考虑以下代码:
row1 = [(2,2), (4,4)]
row2 = [(5,5)]
row3 = [10, 20, 30, 40]
row_tuple_list = []
for r1 in row1:
for r2 in row2:
for r3 in row3:
row_tuple_list.append((r1, r2, r3))
row_index = pd.MultiIndex.from_tuples(row_tuple_list, names=['row1', 'row2', 'row3'])
col1 = ['f', 'i']
col2 = ['g', 'h']
col_tuple_list = []
for c1 in col1:
for c2 in col2:
col_tuple_list.append((c1, c2))
col_index = pd.MultiIndex.from_tuples(col_tuple_list, names=['col1', 'col2'])
df = pd.DataFrame(index=row_index, columns=col_index)
生成数据帧:
col1 f i
col2 g h g h
row1 row2 row3
(2, 2) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
(4, 4) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
现在,我想设置此数据框的各个元素。例如,
w=(2,2)
x=(5,5)
y=10
df.loc[(w,x,y),('f','g')] = 200
print(df)
给出:
col1 f i
col2 g h g h
row1 row2 row3
(2, 2) (5, 5) 10 200 NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
(4, 4) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
有没有办法在不显式设置第二行值的情况下执行此操作(因为我知道第 1 行和第 2 行以相同的频率出现)?
我试过了:
df.loc[(w,slice(None),y),('f','g')] =100
失败了。
# you need to use slice for w as well. This should work.
df.loc[(slice(w),slice(None),y),('f','g')]
df
Out[208]:
col1 f i
col2 g h g h
row1 row2 row3
(2, 2) (5, 5) 10 100 NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN
40 NaN NaN NaN NaN
(4, 4) (5, 5) 10 NaN NaN NaN NaN
20 NaN NaN NaN NaN
30 NaN NaN NaN NaN