source

팬더와 함께 열을 열로 변환

nicesource 2022. 11. 24. 20:41
반응형

팬더와 함께 열을 열로 변환

따라서 내 데이터 집합에는 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")

https://deepnote.com/@DataScience/Unpivot-a-DataFrame-from-wide-to-long-format-lN7WlqOdSlqroI_7DGAkoA

행과 열을 바꾸려면 팬더의 전치 방법을 사용해 보십시오.

df.T

참조 링크를 확인합니다.https://note.nkmk.me/en/python-pandas-t-transpose/

언급URL : https://stackoverflow.com/questions/28654047/convert-columns-into-rows-with-pandas

반응형