如何识别 Pandas 数据框中的字符串

问题描述 投票:0回答:4

假设我有一个像这样的数据框:

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'))
python pandas numpy
4个回答
0
投票

您可以

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)

至于将这些字符串转换为数字,有很多好的解决方案这里


0
投票

我拿了你的数据框并通过这样做解决了它:

第一步,创建一个函数,将罗马数字作为字符串并使其成为整数。

第二步:重新创建数据框

第三步:尝试将

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)

0
投票

混合数据类型将产生一个

'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

0
投票

我会制作地图并使用“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。

© www.soinside.com 2019 - 2024. All rights reserved.