집계를 수행하지 않고 팬더 데이터 프레임에 작업 그룹을 적용하고 싶습니다. 대신 계층 적 구조를 MultiIndex에 반영하기 만하면됩니다.숫자 다중 인덱스를 생성하기위한 팬더 데이터 프레임 그룹화
import pandas as pd
def multi_index_group_by(df, columns):
# TODO: How to write this? (Hard-coded to give the desired result for the example.)
if columns == ["b"]:
df.index = pd.MultiIndex(levels=[[0,1],[0,1,2]], labels=[[0,1,0,1,0],[0,0,1,1,2]])
return df
if columns == ["c"]:
df.index = pd.MultiIndex(levels=[[0,1],[0,1],[0,1]], labels=[[0,1,0,1,0],[0,0,0,1,1],[0,0,1,0,0]])
return df
if __name__ == '__main__':
df = pd.DataFrame({
"a": [0,1,2,3,4],
"b": ["b0","b1","b0","b1","b0"],
"c": ["c0","c0","c0","c1","c1"],
})
print(df.index.values) # [0,1,2,3,4]
# Add level of grouping
df = multi_index_group_by(df, ["b"])
print(df.index.values) # [(0, 0) (1, 0) (0, 1) (1, 1) (0, 2)]
# Examples
print(df.loc[0]) # Group 0
print(df.loc[1,1]) # Group 1, Item 1
# Add level of grouping
df = multi_index_group_by(df, ["c"])
print(df.index.values) # [(0, 0, 0) (1, 0, 0) (0, 0, 1) (1, 1, 0) (0, 1, 0)]
# Examples
print(df.loc[0]) # Group 0
print(df.loc[0,0]) # Group 0, Sub-Group 0
print(df.loc[0,0,1]) # Group 0, Sub-Group 0, Item 1
multi_index_group_by
을 구현하는 가장 좋은 방법은 무엇입니까? 거의 작품을 다음 있지만 결과 지수는 숫자되지 않습니다 :
index_columns = []
# Add level of grouping
index_columns += ["b"]
print(df.set_index(index_columns, drop=False))
# Add level of grouping
index_columns += ["c"]
print(df.set_index(index_columns, drop=False))
편집 :
[
[ #b0
[ #c0
{"a": 0, "b": "b0", "c": "c0"},
{"a": 2, "b": "b0", "c": "c0"},
],
[ #c1
{"a": 4, "b": "b0", "c": "c1"},
]
],
[ #b1
[ #c0
{"a": 1, "b": "b1", "c": "c0"},
],
[ #c1
{"a": 3, "b": "b1", "c": "c1"},
]
]
]
편집 :이 명확히하기 위해, 예에서, 최종 인덱스가 동일해야 : 마지막 LEVE을 제외하고
def autoincrement(value=0):
def _autoincrement(*args, **kwargs):
nonlocal value
result = value
value += 1
return result
return _autoincrement
def swap_levels(df, i, j):
order = list(range(len(df.index.levels)))
order[i], order[j] = order[j], order[i]
return df.reorder_levels(order)
def multi_index_group_by(df, columns):
new_index = df.groupby(columns)[columns[0]].aggregate(autoincrement())
result = df.join(new_index.rename("_new_index"), on=columns)
result.set_index('_new_index', append=True, drop=True, inplace=True)
result.index.name = None
result = swap_levels(result, -2, -1)
return result
그것은 정확한 결과를 제공합니다 여기에 지금까지있어 최고입니다 l, 이는 변함이 없습니다. 여전히 개선의 여지가 상당히있는 것처럼 느껴집니다.
을 준다? – desiato
@desiato 꾸준히 증가하는 색인입니다 (예제 참조). 예를 들어 (0,1,2, ...)는 그룹 0, 하위 그룹 1, 하위 - 하위 그룹 2 등을 의미합니다. – kloffy
기본적으로 색인을 생성하는 것과 같은 방식으로 행을 주소 지정하고 싶습니다. 중첩 목록. – kloffy