팬더는 서로 다른 열을 가진 두 개의 데이터 프레임을 병합합니다.
저는 분명 여기서 간단한 것을 놓치고 있습니다.대부분 같은 열 이름을 가진 팬더에서 두 개의 데이터 프레임을 병합하려고 하지만 오른쪽 데이터 프레임에는 왼쪽에 없는 일부 열이 있고 그 반대도 있습니다.
>df_may
id quantity attr_1 attr_2
0 1 20 0 1
1 2 23 1 1
2 3 19 1 1
3 4 19 0 0
>df_jun
id quantity attr_1 attr_3
0 5 8 1 0
1 6 13 0 1
2 7 20 1 1
3 8 25 1 1
외부 조인을 시도했습니다.
mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")
하지만 결과는 다음과 같습니다.
Left data columns not unique: Index([....
가입할 단일 열도 지정했습니다(on = "id"
, 예를 들어)를 제외한 모든 열이 중복됩니다.id
맘에 들다attr_1_x
,attr_1_y
, 이상적이지 않습니다.또한 전체 열 목록(많은 열이 있음)을 다음으로 넘겼습니다.on
:
mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))
결과는 다음과 같습니다.
ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
제가 무엇을 빠뜨리고 있나요?모든 행이 추가된 df를 받고 싶습니다.attr_1
,attr_2
,attr_3
가능한 한 인구가 밀집되어 있고, 나타나지 않는 NaN.이것은 꽤 전형적인 데이터 녹취 작업 흐름처럼 보이지만, 저는 막막합니다.
이 경우에 당신이 원하는 것은 다음과 같습니다.
In [12]:
pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
attr_1 attr_2 attr_3 id quantity
0 0 1 NaN 1 20
1 1 1 NaN 2 23
2 1 1 NaN 3 19
3 0 0 NaN 4 19
4 1 NaN 0 5 8
5 0 NaN 1 6 13
6 1 NaN 1 7 20
7 1 NaN 1 8 25
지나감으로써axis=0
여기서 당신은 df를 서로 쌓아올리고 있습니다. 당신이 원하는 것이라고 생각합니다.NaN
각각의 dfs에 없는 value.
InvalidIndexError: 고유하게 값이 지정된 인덱스 개체에만 재인덱스를 적용합니다.
예를 들면, 여기에A
3배의trial
열: 다음을 방지합니다.
A = pd.DataFrame([[3, 1, 4, 1]], columns=['id', 'trial', 'trial', 'trial'])
# id trial trial trial
# 0 3 1 4 1
B = pd.DataFrame([[5, 9], [2, 6]], columns=['id', 'trial'])
# id trial
# 0 5 9
# 1 2 6
pd.concat([A, B], ignore_index=True)
# InvalidIndexError: Reindexing only valid with uniquely valued Index objects
이 문제를 해결하려면 다음 작업 전에 열 이름을 중복 제거합니다.
parser = pd.io.parsers.base_parser.ParserBase({'usecols': None})
for df in [A, B]:
df.columns = parser._maybe_dedup_names(df.columns)
pd.concat([A, B], ignore_index=True)
# id trial trial.1 trial.2
# 0 3 1 4 1
# 1 5 9 NaN NaN
# 2 2 6 NaN NaN
또는 한 줄로 되어 있지만 가독성이 떨어집니다.
pd.concat([df.set_axis(parser._maybe_dedup_names(df.columns), axis=1) for df in [A, B]], ignore_index=True)
팬더 <1.3.0>의 경우 다음을 사용합니다.parser = pd.io.parsers.ParserBase({})
오늘 이 문제를 해결하기 위해 concat, pended, merge 중 하나를 사용했습니다. 그리고 순서대로 번호가 매겨진 도우미 열을 추가한 다음 외부 조인을 함으로써 해결했습니다.
helper=1
for i in df1.index:
df1.loc[i,'helper']=helper
helper=helper+1
for i in df2.index:
df2.loc[i,'helper']=helper
helper=helper+1
df1.merge(df2,on='helper',how='outer')
언급URL : https://stackoverflow.com/questions/28097222/pandas-merge-two-dataframes-with-different-columns
'programing' 카테고리의 다른 글
NodeJS를 사용하여 CSV 파일 구문 분석 (0) | 2023.09.11 |
---|---|
Node.js REPL에 있는 함수를 )(로 호출하는 이유는 무엇입니까? (0) | 2023.09.11 |
jquery $.189 jsonp (0) | 2023.09.11 |
형제 경로로 이동하려면 어떻게 해야 합니까? (0) | 2023.09.11 |
R에서 행 인덱스 번호를 얻는 방법은? (0) | 2023.09.11 |