programing

팬더는 서로 다른 열을 가진 두 개의 데이터 프레임을 병합합니다.

newstyles 2023. 9. 11. 21:31

팬더는 서로 다른 열을 가진 두 개의 데이터 프레임을 병합합니다.

저는 분명 여기서 간단한 것을 놓치고 있습니다.대부분 같은 열 이름을 가진 팬더에서 두 개의 데이터 프레임을 병합하려고 하지만 오른쪽 데이터 프레임에는 왼쪽에 없는 일부 열이 있고 그 반대도 있습니다.

>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: 고유하게 값이 지정된 인덱스 개체에만 재인덱스를 적용합니다.

예를 들면, 여기에A3배의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