簡體   English   中英

合並長度不等的熊貓數據框

[英]Merge pandas dataframe with unequal length

我有兩個 Pandas 數據框,我想將它們合並為一個。 它們的長度不等,但包含一些相同的信息。

這是第一個數據框:

BOROUGH  TYPE  TCOUNT
  MAN    SPORT   5
  MAN    CONV    3
  MAN    WAGON   2
  BRO    SPORT   2
  BRO    CONV    3

其中A列指定位置, B列指定類別, C列指定計數。

第二個:

BOROUGH  CAUSE  CCOUNT
  MAN   ALCOHOL   5
  MAN     SIZE    3
  BRO   ALCOHOL   2

這里A再次與另一個數據幀中的位置相同。 D是另一個類別, E是該位置D的計數。

我想要(並且無法做到)是獲得以下內容:

BOROUGH   TYPE   TCOUNT  CAUSE  CCOUNT
  MAN    SPORT     5    ALCOHOL    5
  MAN    CONV      3      SIZE     3
  MAN    WAGON     2      NaN     NaN
  BRO    SPORT     2    ALCOHOL    2
  BRO    CONV      3      NaN     NaN

“-”可以是任何東西。 最好是一個字符串,上面寫着“Nothing”。 如果它們默認為 NaN 值,我想這只是用字符串替換它們的問題。

編輯
輸出:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 233 entries, 0 to 232
Data columns (total 3 columns):
BOROUGH                          233 non-null object
CONTRIBUTING FACTOR VEHICLE 1    233 non-null object
RCOUNT                           233 non-null int64
dtypes: int64(1), object(2)
memory usage: 7.3+ KB
None

<class 'pandas.core.frame.DataFrame'>
Int64Index: 83 entries, 0 to 82
Data columns (total 3 columns):
BOROUGH                83 non-null object
VEHICLE TYPE CODE 1    83 non-null object
VCOUNT                 83 non-null int64
dtypes: int64(1), object(2)
memory usage: 2.6+ KB
None

對 lhs 的列 'A','B' 和 rhs 的 'A','D' 執行left類型merge ,因為這些是您的關鍵列

In [16]:
df.merge(df1, left_on=['A','B'], right_on=['A','D'], how='left')
​
Out[16]:
   A  B  C   D   E
0  1  1  3   1   5
1  1  2  2   2   3
2  1  3  1 NaN NaN
3  2  1  1   1   2
4  2  2  4 NaN NaN

編輯

您的問題已更改,但基本上在這里您可以使用combine_first

In [26]:
merged = df.combine_first(df1)
merged

Out[26]:
  BOROUGH    CAUSE  CCOUNT  TCOUNT   TYPE
0     MAN  ALCOHOL       5       5  SPORT
1     MAN     SIZE       3       3   CONV
2     MAN  ALCOHOL       2       2  WAGON
3     BRO      NaN     NaN       2  SPORT
4     BRO      NaN     NaN       3   CONV

NaN ,你看到的“原因”是字符串“男”,我們可以用fillna來代替這些值:

In [27]:
merged['CAUSE'] = merged['CAUSE'].fillna('Nothing')
merged['CCOUNT'] = merged['CCOUNT'].fillna(0)
merged

Out[27]:
  BOROUGH    CAUSE  CCOUNT  TCOUNT   TYPE
0     MAN  ALCOHOL       5       5  SPORT
1     MAN     SIZE       3       3   CONV
2     MAN  ALCOHOL       2       2  WAGON
3     BRO  Nothing       0       2  SPORT
4     BRO  Nothing       0       3   CONV

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM