假设我有一个像这样的数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame(
[[1, np.nan, 2],
[2, 3, 'I'],
[3, 4, 'II']],
columns=['A', 'B', 'C'])
df
如何识别所有字符串排除空值,如果是罗马数字,则将其转换为与该罗马数字对应的整数?
我尝试用此方法来定位字符串的协调,但它包含空值。
res = np.argwhere(df_pre.values.astype('str'))
map
type
到这些值并与 str
进行比较:
df = pd.DataFrame([[1, np.nan, 2],
[2, 3, 'I'],
[3, 4, 'II']], columns=['A', 'B', 'C'])
df.map(type) == str
输出:
A B C
0 False False False
1 False False True
2 False False True
获取整数索引:
np.argwhere(df.map(type) == str)
输出:
array([[1, 2],
[2, 2]], dtype=int64)
至于将这些字符串转换为数字,有很多好的解决方案这里。
我拿了你的数据框并通过这样做解决了它:
第一步,创建一个函数,将罗马数字作为字符串并使其成为整数。
第二步:重新创建数据框
第三步:尝试将
romanToInt
应用于数据框中所有可能的值
import pandas as pd
import numpy as np
# Define the function to convert Roman numerals to integers
def romanToInt(s):
values = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = 0
for i in range(len(s)):
if i + 1 < len(s) and values[s[i]] < values[s[i + 1]]:
result -= values[s[i]]
else:
result += values[s[i]]
return result
# Define the dataframe
df = pd.DataFrame([[1, np.nan, 2],
[2, 3, 'I'],
[3, 'test_string', 'II']], columns=['A', 'B', 'C'])
# Apply a function element-wise to the entire DataFrame
def convert_value(value):
if pd.notnull(value) and isinstance(value, str):
try:
# Try to make the string an integer
return romanToInt(value)
except:
pass
return value
df = df.map(convert_value)
print(df)
混合数据类型将产生一个
'object'
列,因此第一步是对其进行过滤,然后您可以应用一个函数来检查值的类型。
我将忽略将罗马数字转换为 int 的要求;这在其他地方有所涉及,例如在 python 中将罗马数字转换为整数。我将使用
len
代替执行此操作的函数,它恰好得到了正确的结果。
df1 = df.select_dtypes('object').applymap(lambda x: len(x) if isinstance(x, str) else x)
C
0 2
1 1
2 2
然后您可以将列插入回去,例如
df.assign(**df1)
A B C
0 1 NaN 2
1 2 3.0 1
2 3 4.0 2
我会制作地图并使用“roman”库(https://pypi.org/project/roman/)。
简单的整个代码是:
import roman
import pandas as pd
import numpy as np
df = pd.DataFrame([[1, np.nan, 2],
[2, 3, 'I'],
[3, 4, 'II']], columns=['A', 'B', 'C'])
converted_df = df.map(lambda x: roman.fromRoman(x) if type(x) == str else x)
仅当单元格内值的类型为“str”时,才使用 lambda 函数进行迭代。使用的函数是“fromRoman”。
您可以使用 pip 或您最喜欢的工具安装 roman。