Pandas Dataframe 다시 빌드
Nov 05 2020
나는 Python을 처음 접했습니다. 잘못된 데이터 프레임을 재구성하는 데 문제가 있습니다. 내 데이터 프레임은 다음과 같습니다.
df = pd.DataFrame({'col1': ['id 1', 'id 2', 'test 3', 'test 4'],
'col2': ['test 1', 'test 2',
'Number 6135', 'id 4'],
'col3': ['Number 12344', 'Number 21612','id 3','Number 1131']})
보시다시피 첫 번째, 두 번째 및 Thrid 열에 "id 's"가 있습니다. 다른 값에 대해서도 동일합니다.
내 목표는 각 Col에 다음 예제와 같이 동일한 하위 문자열로 시작하는 값만있는 데이터 프레임을 갖는 것입니다.
나는 for Loops를 사용하고 Statments가 특정 하위 문자열이 내 문자열에 있는지 확인하기 위해 모두 준비했습니다. 그게 사실이면 새 열을 만들고 그 안에 내 값을 씁니다.
for x in df['col1']:
if 'id' in x:
df['newCol']=x
나는이 코드가 내 문제를 결코 해결할 수 없다는 것을 알고 있습니다.이 문제를 해결하는 데 도움이 될 수있는 팬더 함수가있을 수 있습니다.
명확하지 않은 것이 있으면 문제를 설명하기 위해 최선을 다할 것입니다. 당신의 도움에 미리 감사드립니다.
답변
3 AndrejKesely Nov 05 2020 at 17:34
sorted()사용자 정의 키 기능과 함께 사용할 수 있습니다 .
def key_fn(x):
if 'id' in x:
return 0
if 'test' in x:
return 1
if 'Number' in x:
return 2
return 3
df = df.apply(lambda x: pd.Series(sorted(x, key=key_fn)), axis=1)
df = df.rename(columns=lambda x: 'col{}'.format(x+1))
print(df)
인쇄물:
col1 col2 col3
0 id 1 test 1 Number 12344
1 id 2 test 2 Number 21612
2 id 3 test 3 Number 6135
3 id 4 test 4 Number 1131
댓글에서 다른 버전 :
df = pd.DataFrame([sorted(l, key=key_fn) for l in df.values], columns=df.columns)
print(df)
3 jezrael Nov 05 2020 at 17:34
가능한 경우 첫 번째 공백으로 값을 분할하여 솔루션을 단순화하십시오.
df = (df.reset_index()
.melt('index')
.assign(new = lambda x: x['value'].str.split().str[0])
.pivot('index','new','value'))
print (df)
new Number id test
index
0 Number 12344 id 1 test 1
1 Number 21612 id 2 test 2
2 Number 6135 id 3 test 3
3 Number 1131 id 4 test 4
그렇지 않으면 다음을 사용할 수 있습니다 Series.str.extract.
L = ['id','test','Number']
df = (df.reset_index()
.melt('index')
.assign(new = lambda x: x['value'].str.extract(f'({"|".join(L)})', expand=False))
.pivot('index','new','value'))
print (df)
new Number id test
index
0 Number 12344 id 1 test 1
1 Number 21612 id 2 test 2
2 Number 6135 id 3 test 3
3 Number 1131 id 4 test 4
AndyL. Nov 05 2020 at 17:38
이 시도:
s = df.melt()['value']
df_final = pd.DataFrame({x: s[s.str.startswith(x)].values
for x in s.str.split().str[0].unique()})
Out[27]:
id test Number
0 id 1 test 3 Number 6135
1 id 2 test 4 Number 12344
2 id 4 test 1 Number 21612
3 id 3 test 2 Number 1131
sammywemmy Nov 05 2020 at 17:48
먼저 데이터 프레임을 녹인 다음 numpy select 를 사용 하여 이름을 재정렬하고 마지막으로 피벗 할 수 있습니다 .
(df.melt(ignore_index=False)
.assign(variable=lambda x: np.select([x.value.str.startswith("id"),
x.value.str.startswith("test"),
x.value.str.startswith("Number")],
["col1", "col2", "col3"]))
.reset_index()
.pivot("index", "variable", "value")
.rename_axis(columns=None, index=None))
col1 col2 col3
0 id 1 test 1 Number 12344
1 id 2 test 2 Number 21612
2 id 3 test 3 Number 6135
3 id 4 test 4 Number 1131