问题的提出
问题: 给定一个PandasDataFrame ;如何将DataFrame 中的字符串改为小写?
例子 :考虑下面这个PandasDataFrame
import pandas as pd
import numpy as np
data = {
'col_1': ['ONE', 'TWO', 'Three', np.NAN, '100'],
}
df = pd.DataFrame(data)
print(df)
输出
col_1
0 ONE
1 TWO
2 Three
3 NaN
4 100
预期的输出
col_1
0 one
1 two
2 three
3 NaN
4 100
当你将一个pandasDataFrame 字符串列改为小写时,那么该列会被返回,使该列中的每一个字符串都被转换为小写并显示出来,而任何非字母的字符都保持不变,如上面预期的输出。
让我们深入了解不同的方法,帮助我们将DataFrame中的大写字符串转换为小写。
方法1:使用str.lower()
方法 :在列上调用str.lower() 函数,将其字符串值变为小写。要选择一个列,使用方括号符号并在其中指定列名,例如:df['column_name'] 。
代码
import pandas as pd
import numpy as np
data = {
'col_1': ['ONE', 'TWO', 'Three', np.NAN, '100'],
}
df = pd.DataFrame(data)
df['col_1'] = df['col_1'].str.lower()
print(df)
输出
col_1
0 one
1 two
2 three
3 NaN
4 100
重述到str.lower() 。 返回给定字符串的小写版本。
方法2:使用 str.casefold()
这里的想法与str.lowercase() 方法非常相似。唯一的区别是我们将使用str.casefold() 方法而不是lower() 方法。
代码
import pandas as pd
import numpy as np
data = {
'col_1': ['ONE', 'TWO', 'Three', np.NAN, '100'],
}
df = pd.DataFrame(data)
df['col_1'] = df['col_1'].str.casefold()
print(df)
输出
col_1
0 one
1 two
2 three
3 NaN
4 100
str.casefold() 是Python中的一个内置方法,它返回一个字符串,其中返回的所有字符都是小写的。
casefold() 方法与lower() 方法相似,但是casefold() 方法表现出比lower() 方法更积极、更强烈的行为。例如,德语中的小写字母'ß' 相当于 'ss' 。lower() 方法将无法将其转换为小写的等价物。然而,casefold() 方法会将其转换为 'ss'。
例子
text = 'außen'
print(text.casefold())
text = 'außen'
print(text.lower())
输出
aussenaußen
方法3:使用map+lambda+isinstance
方法
- 使用
isinstance()方法检查该值是否代表一个字符串值。 - 如果是字符串,那么在返回之前使用
lower()方法将其转换为小写字母。否则,简单地使用lambda函数返回该值。 - 在这个lambda函数上使用
map函数,对数据框架中选定的列中的每个值进行操作。
代码
import pandas as pd
import numpy as np
data = {
'col_1': ['ONE', 'TWO', 'Three', np.NAN, '100'],
}
df = pd.DataFrame(data)
df['col_1'] = df['col_1'].map(lambda x: x.lower() if isinstance(x,str) else x)
print(df)
输出
col_1
0 one
1 two
2 three
3 NaN
4 100
lambda函数是Python中的一个匿名函数。它以关键字lambda 开始,后面是一个用逗号分隔的零个或多个参数的列表,然后是冒号和返回表达式。例如,lambda x, y, z: x+y+z 将计算三个参数值的总和x+y+z 。
map() 函数将一个或多个迭代表转化为一个新的迭代表,方法是对每个迭代表的第i个元素应用一个 "转化器函数"。参数是 转化器函数对象和一个或多个迭代变量。如果你传递n个迭代变量作为参数,转化器函数必须是一个n次方函数,接受n输入参数。返回值是一个可迭代的地图对象,其中包括被转换的元素和可能被聚合的元素。
Python 内置的isinstance(object, class) 函数将一个object 和一个类作为输入参数。如果object 是该类的一个实例,它就返回True 。否则,它将返回False 。你也可以通过一个类的元组来检查对象是否是元组中任何一个类的实例,而不是一个类,比如在isinstance(object, (class_A, class_B, ...)) 。
奖励:列中的元组列表中的小写字符串
这里有一个更高级的方案,它可以改变一个由列内图元列表组成的DataFrame的字符串值。
import pandas as pd
data = {'text': [
('GERMANY', 'BERLIN'),
('INDIA','New Delhi')
]}, {'text': [
('Canada', 'Ottawa'),
('Italy', 'Rome')
]}
df = pd.DataFrame(data)
df = df['text'].apply(lambda col: [(x[0].lower(), x[1].lower()) for x in col])
print(df)
输出
0 [(germany, berlin), (india, new delhi)]
1 [(canada, ottawa), (italy, rome)]
Name: text, dtype: object
结论
因此,在本教程中,我们学习了将DataFrame 特定列中的字符串值转换为小写的三种不同方法。