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 值。
我有一个包含 '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 值。