pandas 列上的映射函数作为一个系列在该列上工作正常,但在数据框中的列中给出 None 值

map function on pandas column works fine on the column as a series, but gives None values in column in dataframe

我有一个包含 'Month' 列的 df。该列中的符号例如是 'Apr 2021'。所有月份都是如此,所以一月、二月、三月等。而且很多年都是如此。 我需要更改,例如 'Apr 2021' 到 04-2021(首先作为 str,然后作为 datetime)。 我制作的功能作为一个系列在专栏上运行良好。 BUTTTT .....正如您在下方看到的:该系列很好,但 Dataframe 中的列显示 None 列 'Month' 中的所有行。 怎么了here/what我做错了吗?下面的所有代码。谢谢!

df_all.Month (first rows)
0     Feb 2021
1     Mar 2021
2     Mar 2021
3     Apr 2021
4     Apr 2021
5     May 2021
6     May 2021
7     May 2021
8     Jun 2021
9     Jun 2021
10    Jun 2021

更改值的函数:

def test(x):
    x.strip()
    deel = x.split()
    if deel[0] == 'Jan': 
        deel[0] = '01-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Feb': 
        deel[0] = '02-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Mar': 
        deel[0] = '03-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Apr': 
        deel[0] = '04-'
        x = deel[0] + deel[1]
    elif deel[0] == 'May': 
        deel[0] = '05-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Jun': 
        deel[0] = '06-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Jul': 
        deel[0] = '07-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Aug': 
        deel[0] = '08-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Sep': 
        deel[0] = '09-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Oct': 
        deel[0] = '10-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Nov': 
        deel[0] = '1-'
        x = deel[0] + deel[1]
    elif deel[0] == 'Dec': 
        deel[0] = '12-'
        x = deel[0] + deel[1]
    else: 
        print('nope')

这给出了改变的系列,所以这有效(但如前所述,不在 df 中,如系列下方所示)

df_all['Month'] = df_all['Month'].map(test)
df_all


02-2021
03-2021
03-2021
04-2021
04-2021
05-2021
05-2021
05-2021
06-2021
06-2021
06-2021
07-2021
07-2021
07-2021
08-2021
08-2021
08-2021
09-2021
09-2021
09-2021
10-2021
10-2021
10-2021
1-2021
1-2021
1-2021
12-2021
12-2021
12-2021
01-2022
01-2022
01-2022
02-2022
02-2022
02-2022

(df 的第一行:

Month   Access Type Users Accessing Apps
0   None    Analyzer    7
1   None    Analyzer    77
2   None    Professional    3
3   None    Analyzer    114
4   None    Professional    3
5   None    Analyzer    104

添加一个全新的列给出了相同的结果:系列没问题,但新列只包含 None 个值...

     Month     Access Type    Users Accessing Apps  Maand
0   Feb 2021    Analyzer          7                 None
1   Mar 2021    Analyzer         77                 None
2   Mar 2021    Professional      3                 None
3   Apr 2021    Analyzer        114                 None
4   Apr 2021    Professional      3                 None

也许这对你有帮助:

df_all['Maand'] = df_all['Month'].map(test)
print(df_all['Maand'])
type(df_all.Maand)

02-2021
03-2021
03-2021
04-2021
04-2021
05-2021
05-2021
05-2021
06-2021
06-2021
06-2021
07-2021
07-2021
07-2021
08-2021
08-2021
08-2021
09-2021
09-2021
09-2021
10-2021
10-2021
10-2021
1-2021
1-2021
1-2021
12-2021
12-2021
12-2021
01-2022
01-2022
01-2022
02-2022
02-2022
02-2022
0     None
1     None
2     None
3     None
4     None
5     None
6     None
7     None
8     None
9     None
10    None
11    None
12    None
13    None
14    None
15    None
16    None
17    None
18    None
19    None
20    None
21    None
22    None
23    None
24    None
25    None
26    None
27    None
28    None
29    None
30    None
31    None
32    None
33    None
34    None
Name: Maand, dtype: object
pandas.core.series.Series

使用 pandas' pd.to_datetime() 函数有一种更简单的方法。

df_all['Month']  = pd.to_datetime(df_all['Month'], format= "%b %Y")

我相信你应该有不同的方法来处理你的问题。一个好的解决方案涉及只使用日期时间,这样您就可以轻松地浏览日期,使用适当的函数来提高代码的效率。

下面的代码完成格式化工作,不需要使用带有一系列条件语句的函数:

df_all = pd.DataFrame({'Month': ['Feb 2021','Mar 2021','Mar 2021','Apr 2021','Apr 2021','May 2021','May 2021','May 2021','Jun 2021','Jun 2021','Jun 2021']})
df_all

       Month
0   Feb 2021
1   Mar 2021
2   Mar 2021
3   Apr 2021
4   Apr 2021
5   May 2021
6   May 2021
7   May 2021
8   Jun 2021
9   Jun 2021
10  Jun 2021

我的建议:用这个代替你的函数。

df_all['Maand'] = pd.to_datetime(df_all['Month'],format='%b %Y').dt.to_period('M')

输出:

       Month      Maand
0   Feb 2021    2021-02
1   Mar 2021    2021-03
2   Mar 2021    2021-03
3   Apr 2021    2021-04
4   Apr 2021    2021-04
5   May 2021    2021-05
6   May 2021    2021-05
7   May 2021    2021-05
8   Jun 2021    2021-06
9   Jun 2021    2021-06
10  Jun 2021    2021-06
df_all.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 11 entries, 0 to 10
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype    
---  ------  --------------  -----    
 0   Month   11 non-null     object   
 1   Maand   11 non-null     period[M]
dtypes: object(1), period[M](1)
memory usage: 304.0+ bytes

答案显示了一种更简单的方法。但是我仍然不明白为什么 map 函数(我也尝试过应用)确实改变了系列但由于某种原因在 DF 中给出了 None 值。