이것은 SAS를 사용하기 전에 대답 한 질문을 말합니다. SAS-행의 여러 변수를 열로 전치
새로운 것은 변수의 길이가 2가 아니라 다양하다는 것입니다. 다음은 그 예입니다.
acct la ln seq1 seq2
0 9999 20.01 100 1 10
1 9999 19.05 1 1 10
2 9999 30.00 1 1 10
3 9999 26.77 100 2 11
4 9999 24.96 1 2 11
5 8888 38.43 218 3 20
6 8888 37.53 1 3 20
내 원하는 출력은 다음과 같습니다.
acct la ln seq1 seq2 la0 la1 la2 la3 ln0 ln1 ln2
5 8888 38.43 218 3 20 38.43 37.53 NaN NaN 218 1 NaN
0 9999 20.01 100 1 10 20.01 19.05 30 NaN 100 1 1
3 9999 26.77 100 2 11 26.77 24.96 NaN NaN 100 1 NaN
SAS에서는 상당히 간단한 proc 요약을 사용할 수 있지만 더 이상 SAS를 사용할 수 없기 때문에 Python에서 수행하고 싶습니다.
나는 내 문제에 재사용 할 수있는 질문을 이미 해결했지만 내가 보지 못한 Pandas에 더 쉬운 옵션이 있는지 궁금합니다. 여기 내 해결책이 있습니다. 누군가가 더 빠른 접근 방식을 가지고 있다면 흥미로울 것입니다!
# write multiple row to col based on groupby
import pandas as pd
from pandas import DataFrame
import numpy as np
data = DataFrame({
"acct": [9999, 9999, 9999, 9999, 9999, 8888, 8888],
"seq1": [1, 1, 1, 2, 2, 3, 3],
"seq2": [10, 10, 10, 11, 11, 20, 20],
"la": [20.01, 19.05, 30, 26.77, 24.96, 38.43, 37.53],
"ln": [100, 1, 1, 100, 1, 218, 1]
})
# group the variables by some classes
grouped = data.groupby(["acct", "seq1", "seq2"])
def rows_to_col(column, size):
# create head and contain to iterate through the groupby values
head = []
contain = []
for i,j in grouped:
head.append(i)
contain.append(j)
# transpose the values in contain
contain_transpose = []
for i in range(0,len(contain)):
contain_transpose.append(contain[i][column].tolist())
# determine the longest list of a sublist
length = len(max(contain_transpose, key = len))
# assign missing values to sublist smaller than longest list
for i in range(0, len(contain_transpose)):
if len(contain_transpose[i]) != length:
contain_transpose[i].append("NaN" * (length - len(contain_transpose[i])))
# create columns for the transposed column values
for i in range(0, len(contain)):
for j in range(0, size):
contain[i][column + str(j)] = np.nan
# assign the transposed values to the column
for i in range(0, len(contain)):
for j in range(0, length):
contain[i][column + str(j)] = contain_transpose[i][j]
# now always take the first values of the grouped group
concat_list = []
for i in range(0, len(contain)):
concat_list.append(contain[i][:1])
return pd.concat(concat_list) # concate the list
# fill in column name and expected size of the column
data_la = rows_to_col("la", 4)
data_ln = rows_to_col("ln", 3)
# merge the two data frames together
cols_use = data_ln.columns.difference(data_la.columns)
data_final = pd.merge(data_la, data_ln[cols_use], left_index=True, right_index=True, how="outer")
data_final.drop(["la", "ln"], axis = 1)
참고 :
In [58]:
print grouped.la.apply(lambda x: pd.Series(data=x.values)).unstack()
0 1 2
acct seq1 seq2
8888 3 20 38.43 37.53 NaN
9999 1 10 20.01 19.05 30
2 11 26.77 24.96 NaN
과:
In [59]:
print grouped.ln.apply(lambda x: pd.Series(data=x.values)).unstack()
0 1 2
acct seq1 seq2
8888 3 20 218 1 NaN
9999 1 10 100 1 1
2 11 100 1 NaN
따라서:
In [60]:
df2 = pd.concat((grouped.la.apply(lambda x: pd.Series(data=x.values)).unstack(),
grouped.ln.apply(lambda x: pd.Series(data=x.values)).unstack()),
keys= ['la', 'ln'], axis=1)
print df2
la ln
0 1 2 0 1 2
acct seq1 seq2
8888 3 20 38.43 37.53 NaN 218 1 NaN
9999 1 10 20.01 19.05 30 100 1 1
2 11 26.77 24.96 NaN 100 1 NaN
유일한 문제는 열 인덱스가 MultiIndex
. 원하지 않는 경우 다음과 같이 변환 할 수 있습니다 la0....
.
df2.columns = map(lambda x: x[0]+str(x[1]), df2.columns.tolist())
어떻게 생각 하시는지 모르겠습니다. 그러나 SAS
PROC TRANSPOSE
더 나은 가독성을 위해 구문을 선호합니다 . Pandas
구문은 간결하지만이 특별한 경우에는 가독성이 떨어집니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다