簡體   English   中英

Python 3 Pandas合並或合並具有相似數據的列

[英]Python 3 Pandas Combining or merging columns with similar data

我有一個數據框,我試圖用性別列更新性別列

import pandas as pd
import numpy as np

df=pd.DataFrame({'Users': [ 'Al Gore', 'Ned Flonders', 'Kim jong un', 'Al Sharpton', 'Michele', 'Richard Johnson', 'Taylor Swift', 'Alf pig', 'Dick Johnson', 'Dana Jovy'],
                 'Gender': [np.nan,'Male','Male','Male',np.nan,np.nan, 'Female',np.nan,'Male','Female'],
                 'Sex': ['M',np.nan,np.nan,'M','F',np.nan, 'F',np.nan,np.nan,'F']})

產量

>>> 
   Gender  Sex            Users
0     NaN    M          Al Gore
1    Male  NaN     Ned Flonders
2    Male  NaN      Kim jong un
3    Male    M      Al Sharpton
4     NaN    F          Michele
5     NaN  NaN  Richard Johnson
6  Female    F     Taylor Swift
7     NaN  NaN          Alf pig
8    Male  NaN     Dick Johnson
9  Female    F        Dana Jovy

[10 rows x 3 columns]

因此,如果在“性別”列中為男性,則在性別列中將顯示為M。

到目前為止,這是我嘗試過的事情:

df['Sex2']=(df.Gender.isin(['Male']).map({True:'M',False:''}) +
                df.Sex.isin(['M']).map({True:'M',False:''}) +
                df.Sex.isin(['F']).map({True:'F',False:''})+
                df.Gender.isin(['Female']).map({True:'F',False:''}))

print(df)

產量

[10 rows x 3 columns]
   Gender  Sex            Users Sex2
0     NaN    M          Al Gore    M
1    Male  NaN     Ned Flonders    M
2    Male  NaN      Kim jong un    M
3    Male    M      Al Sharpton   MM
4     NaN    F          Michele    F
5     NaN  NaN  Richard Johnson     
6  Female    F     Taylor Swift   FF
7     NaN  NaN          Alf pig     
8    Male  NaN     Dick Johnson    M
9  Female    F        Dana Jovy   FF

[10 rows x 4 columns]

我幾乎明白了,但這可能不太有效

這是我想要的輸出

>>> 
   Gender  Sex            Users
0     NaN    M          Al Gore
1    Male    M     Ned Flonders
2    Male    M      Kim jong un
3    Male    M      Al Sharpton
4     NaN    F          Michele
5     NaN  NaN  Richard Johnson
6  Female    F     Taylor Swift
7     NaN  NaN          Alf pig
8    Male    M     Dick Johnson
9  Female    F        Dana Jovy

[10 rows x 3 columns]

是否可以使用某些合並或更新功能來做到這一點?

使用map

In [14]:

import pandas as pd
import numpy as np

df=pd.DataFrame({'Users': [ 'Al Gore', 'Ned Flonders', 'Kim jong un', 'Al Sharpton', 'Michele', 'Richard Johnson', 'Taylor Swift', 'Alf pig', 'Dick Johnson', 'Dana Jovy'],
                 'Gender': [np.nan,'Male','Male','Male',np.nan,np.nan, 'Female',np.nan,'Male','Female'],
                 'Sex': ['M',np.nan,np.nan,'M','F',np.nan, 'F',np.nan,np.nan,'F']})

In [15]:

df

Out[15]:

   Gender  Sex            Users
0     NaN    M          Al Gore
1    Male  NaN     Ned Flonders
2    Male  NaN      Kim jong un
3    Male    M      Al Sharpton
4     NaN    F          Michele
5     NaN  NaN  Richard Johnson
6  Female    F     Taylor Swift
7     NaN  NaN          Alf pig
8    Male  NaN     Dick Johnson
9  Female    F        Dana Jovy

[10 rows x 3 columns]

In [16]:

# create a sex dict
sex_map = {'Male':'M', 'Female':'F'}
# update only those where sex is NaN, apply map to gender to fill in values
df.loc[df.Sex.isnull(),'Sex'] = df['Gender'].map(sex_map)
df

Out[16]:

   Gender  Sex            Users
0     NaN    M          Al Gore
1    Male    M     Ned Flonders
2    Male    M      Kim jong un
3    Male    M      Al Sharpton
4     NaN    F          Michele
5     NaN  NaN  Richard Johnson
6  Female    F     Taylor Swift
7     NaN  NaN          Alf pig
8    Male    M     Dick Johnson
9  Female    F        Dana Jovy

[10 rows x 3 columns]

比較效果:

In [21]:
%timeit df['Sex2']=(df.Gender.isin(['Male']).map({True:'M',False:''}) + df.Sex.isin(['M']).map({True:'M',False:''}) + df.Sex.isin(['F']).map({True:'F',False:''})+                df.Gender.isin(['Female']).map({True:'F',False:''}))

100 loops, best of 3: 2.38 ms per loop

In [24]:
%timeit df.loc[df.Sex.isnull(),'Sex'] = df['Gender'].map(sex_map)

1000 loops, best of 3: 1.21 ms per loop

In [27]:
# without the NaN mask which is similar to what you are doing
%timeit df['Sex'] = df['Gender'].map(sex_map)

1000 loops, best of 3: 531 µs per loop

因此,在這個小樣本上,它速度更快,而對於更大的數據幀,由於使用了cython,它應該明顯更快。

暫無
暫無

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

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