仅按键分组,不执行任何其他更改
Only groupby a key and not performing any other changes
是否可以仅按键对行进行分组,而不对要索引的键列以外的任何其他列执行任何更改?
如果是,我们该怎么做?
df = pd.DataFrame({
'id': ['A','A','A','B','B','C','C','C','C'],
'data1': [11,35,46,11,26,25,39,50,55],
'data2': [1,1,1,1,1,2,2,2,2],
})
df
我想要一个框架,其中我们将 ['A', 'B', 'C']
作为索引,data1 和 data2 的每一行存储到索引 A if id=A
,索引 B if id=B
和索引 C if id=C
像这样:
data1 data2
A 11 1
35 1
46 1
B 11 1
26 1
C 25 2
39 2
50 2
55 2
如果我理解正确,你可以遍历 DataFrame.groupby()
:
的结果
for idx, g in df.groupby("id"):
print("Idx =", idx)
print(g)
print("-" * 80)
打印:
Idx = A
id data1 data2
0 A 11 1
1 A 35 1
2 A 46 1
--------------------------------------------------------------------------------
Idx = B
id data1 data2
3 B 11 1
4 B 26 1
--------------------------------------------------------------------------------
Idx = C
id data1 data2
5 C 25 2
6 C 39 2
7 C 50 2
8 C 55 2
--------------------------------------------------------------------------------
为什么不把id
设为索引呢?像这样:
df = pd.DataFrame({
'id': ['A','A','A','B','B','C','C','C','C'],
'data1': [11,35,46,11,26,25,39,50,55],
'data2': [1,1,1,1,1,2,2,2,2],
})
df.set_index(['id'], inplace=True)
df[df.index.isin(['A'])]
输出 1:
或者可以创建一个假的多重索引?
df = pd.DataFrame({
'id': ['A','A','A','B','B','C','C','C','C'],
'data1': [11,35,46,11,26,25,39,50,55],
'data2': [1,1,1,1,1,2,2,2,2],
})
### create empty column
df['empty'] = ''
### create multi index
df.set_index(['id','empty'], inplace=True)
# rename index to none if you dont want index name
df.index.set_names(None, level=0, inplace=True)
### query like this
df.loc[df.index.get_level_values(0) == 'A']
## or like this
df.loc[df.index.get_level_values(0) == 'A'].droplevel(1)
是否可以仅按键对行进行分组,而不对要索引的键列以外的任何其他列执行任何更改? 如果是,我们该怎么做?
df = pd.DataFrame({
'id': ['A','A','A','B','B','C','C','C','C'],
'data1': [11,35,46,11,26,25,39,50,55],
'data2': [1,1,1,1,1,2,2,2,2],
})
df
我想要一个框架,其中我们将 ['A', 'B', 'C']
作为索引,data1 和 data2 的每一行存储到索引 A if id=A
,索引 B if id=B
和索引 C if id=C
像这样:
data1 data2
A 11 1
35 1
46 1
B 11 1
26 1
C 25 2
39 2
50 2
55 2
如果我理解正确,你可以遍历 DataFrame.groupby()
:
for idx, g in df.groupby("id"):
print("Idx =", idx)
print(g)
print("-" * 80)
打印:
Idx = A
id data1 data2
0 A 11 1
1 A 35 1
2 A 46 1
--------------------------------------------------------------------------------
Idx = B
id data1 data2
3 B 11 1
4 B 26 1
--------------------------------------------------------------------------------
Idx = C
id data1 data2
5 C 25 2
6 C 39 2
7 C 50 2
8 C 55 2
--------------------------------------------------------------------------------
为什么不把id
设为索引呢?像这样:
df = pd.DataFrame({
'id': ['A','A','A','B','B','C','C','C','C'],
'data1': [11,35,46,11,26,25,39,50,55],
'data2': [1,1,1,1,1,2,2,2,2],
})
df.set_index(['id'], inplace=True)
df[df.index.isin(['A'])]
输出 1:
或者可以创建一个假的多重索引?
df = pd.DataFrame({
'id': ['A','A','A','B','B','C','C','C','C'],
'data1': [11,35,46,11,26,25,39,50,55],
'data2': [1,1,1,1,1,2,2,2,2],
})
### create empty column
df['empty'] = ''
### create multi index
df.set_index(['id','empty'], inplace=True)
# rename index to none if you dont want index name
df.index.set_names(None, level=0, inplace=True)
### query like this
df.loc[df.index.get_level_values(0) == 'A']
## or like this
df.loc[df.index.get_level_values(0) == 'A'].droplevel(1)