팬더와 함께 열을 열로 변환
따라서 내 데이터 집합에는 n개 날짜에 대한 위치별 정보가 있습니다.문제는 각 날짜가 실제로는 다른 열 머리글이라는 것입니다.예를 들어 CSV는 다음과 같습니다.
location name Jan-2010 Feb-2010 March-2010
A "test" 12 20 30
B "foo" 18 20 25
제가 원하는 것은 이 제품이
location name Date Value
A "test" Jan-2010 12
A "test" Feb-2010 20
A "test" March-2010 30
B "foo" Jan-2010 18
B "foo" Feb-2010 20
B "foo" March-2010 25
문제는 열에 날짜가 몇 개 있는지 모른다는 것입니다(항상 이름 뒤에 시작되지만).
갱신하다
v0.20부터melt
이제 를 사용할 수 있습니다.
df.melt(id_vars=["location", "name"],
var_name="Date",
value_name="Value")
location name Date Value
0 A "test" Jan-2010 12
1 B "foo" Jan-2010 18
2 A "test" Feb-2010 20
3 B "foo" Feb-2010 20
4 A "test" March-2010 30
5 B "foo" March-2010 25
이전 버전: 0.20 미만
를 사용하여 대부분의 경로를 파악한 후 다음과 같이 정렬할 수 있습니다.
>>> df
location name Jan-2010 Feb-2010 March-2010
0 A test 12 20 30
1 B foo 18 20 25
>>> df2 = pd.melt(df, id_vars=["location", "name"],
var_name="Date", value_name="Value")
>>> df2
location name Date Value
0 A test Jan-2010 12
1 B foo Jan-2010 18
2 A test Feb-2010 20
3 B foo Feb-2010 20
4 A test March-2010 30
5 B foo March-2010 25
>>> df2 = df2.sort(["location", "name"])
>>> df2
location name Date Value
0 A test Jan-2010 12
2 A test Feb-2010 20
4 A test March-2010 30
1 B foo Jan-2010 18
3 B foo Feb-2010 20
5 B foo March-2010 25
(제대로 하고 싶을 수도 있습니다).reset_index(drop=True)
출력의 청결을 유지하기 위해서입니다).
주의:pd.DataFrame.sort
는 에 의해 폐지되었습니다.
와 함께 사용:MultiIndex Series
, 그럼 다음 경우DataFrame
을 덧붙이다.rename
:
df1 = (df.set_index(["location", "name"])
.stack()
.reset_index(name='Value')
.rename(columns={'level_2':'Date'}))
print (df1)
location name Date Value
0 A test Jan-2010 12
1 A test Feb-2010 20
2 A test March-2010 30
3 B foo Jan-2010 18
4 B foo Feb-2010 20
5 B foo March-2010 25
pd.wide_to_long
연도 열에 접두사를 추가한 후 직접 에 피드할 수 있습니다.pd.wide_to_long
효율적인 것처럼 보이지는 않지만, 특정 상황에서는 컬럼에 이미 적절한 접두사가 있는 경우보다 편리할 수 있습니다.
df.columns = np.hstack((df.columns[:2], df.columns[2:].map(lambda x: f'Value{x}')))
res = pd.wide_to_long(df, stubnames=['Value'], i='name', j='Date').reset_index()\
.sort_values(['location', 'name'])
print(res)
name Date location Value
0 test Jan-2010 A 12
2 test Feb-2010 A 20
4 test March-2010 A 30
1 foo Jan-2010 B 18
3 foo Feb-2010 B 20
5 foo March-2010 B 25
더 간단한 해결책을 찾은 것 같아
temp1 = pd.melt(df1, id_vars=["location"], var_name='Date', value_name='Value')
temp2 = pd.melt(df1, id_vars=["name"], var_name='Date', value_name='Value')
전체temp1
와 함께temp2
의 컬럼name
temp1['new_column'] = temp2['name']
이제 당신이 원하는 것을 얻을 수 있습니다.
노트북에 링크를 추가하여 다음 명령을 사용하여 @DMS의 답변을 보여줍니다.
df.melt(id_vars=["location", "name"],
var_name="date",
value_name="value")
행과 열을 바꾸려면 팬더의 전치 방법을 사용해 보십시오.
df.T
참조 링크를 확인합니다.https://note.nkmk.me/en/python-pandas-t-transpose/
언급URL : https://stackoverflow.com/questions/28654047/convert-columns-into-rows-with-pandas
'source' 카테고리의 다른 글
기본 최대 Java 힙사이즈는 어떻게 결정됩니까? (0) | 2022.11.24 |
---|---|
MySQL/쓰기 파일 오류(Ercode 28) (0) | 2022.11.24 |
Loader Manager에서의 initLoader와 restartLoader의 차이점 (0) | 2022.11.24 |
mysql에서 현재 사용자 이름을 알 수 있는 방법이 있나요? (0) | 2022.11.24 |
잭슨은 낙타 사건을 지지하기 위해 밑줄을 긋다 (0) | 2022.11.24 |