pandas:将多列转换为字符串

3
我有一些列['a', 'b', 'c', etc.](其中acfloat64,而bobject)。
我想将所有列转换为字符串并保留nan值。
尝试使用df[['a','b','c']] == df[['a','b','c']].astype(str),但这会导致float64列留下空白。
目前,我正在采用以下方法逐个进行处理:
df['a'] = df['a'].apply(str)
df['a'] = df['a'].replace('nan', np.nan)

使用 .astype(str) 然后将 '' 替换为 np.nan 是最好的方法吗?副问题: .astype(str).apply(str) 有区别吗?

示例输入:(数据类型: a=float64, b=object, c=float64)

a, b, c, etc.
23, 'a42', 142, etc.
51, '3', 12, etc.
NaN, NaN, NaN, etc.
24, 'a1', NaN, etc.

期望的输出: (数据类型: a=对象,b=对象,c=对象)

a, b, c, etc.
'23', 'a42', '142', etc.
'51', 'a3', '12', etc.
NaN, NaN, NaN, etc.
'24', 'a1', NaN, etc.

你能否发布样本输入和期望输出数据集? - MaxU - stand with Ukraine
@Maxu 当然,我更新了问题。 - As3adTintin
4个回答

7
这将给你列名称的列表。
lst = list(df)

这将所有列转换为字符串类型

df[lst] = df[lst].astype(str)

4
df = pd.DataFrame({
    'a': [23.0, 51.0, np.nan, 24.0],
    'b': ["a42", "3", np.nan, "a1"],
    'c': [142.0, 12.0, np.nan, np.nan]})

for col in df:
    df[col] = [np.nan if (not isinstance(val, str) and np.isnan(val)) else 
               (val if isinstance(val, str) else str(int(val))) 
               for val in df[col].tolist()]

>>> df
     a    b    c
0   23  a42  142
1   51    3   12
2  NaN  NaN  NaN
3   24   a1  NaN

>>> df.values
array([['23', 'a42', '142'],
       ['51', '3', '12'],
       [nan, nan, nan],
       ['24', 'a1', nan]], dtype=object)

谢谢!基本上,它会遍历每一列,如果不是字符串且缺失,则留下np.nan,否则将该值转换为字符串(如果我理解正确的话)。太好了!你知道如何去掉.0吗? - As3adTintin
1
由于 np.nan 的存在,这些列被转换为浮点数。我会添加一些内容以将其转换为整数。 - Alexander

3
您可以对数据框的每个元素应用.astype()函数,或者也可以通过以下方式选择要转换为字符串的感兴趣的列。
In [41]: df1 = pd.DataFrame({
    ...:     'a': [23.0, 51.0, np.nan, 24.0],
    ...:     'b': ["a42", "3", np.nan, "a1"],
    ...:     'c': [142.0, 12.0, np.nan, np.nan]})
    ...: 

In [42]: 

In [42]: df1
Out[42]: 
      a    b      c
0  23.0  a42  142.0
1  51.0    3   12.0
2   NaN  NaN    NaN
3  24.0   a1    NaN

### Shows current data type of the columns:
In [43]: df1.dtypes
Out[43]: 
a    float64
b     object
c    float64
dtype: object

### Applying .astype() on each element of the dataframe converts the datatype to string
In [45]: df1.astype(str).dtypes
Out[45]: 
a    object
b    object
c    object
dtype: object

### Or, you could select the column of interest to convert it to strings
In [48]: df1[["a", "b", "c"]] = df1[["a","b", "c"]].astype(str)

In [49]: df1.dtypes ### Datatype update
Out[49]: 
a    object
b    object
c    object
dtype: object

1
为什么 df1.astype(str).dtypes 只显示对象类型? - Brainless

0

我是这样做的。

从特定列中获取所有值,例如“text”。

k = df['text'].values

然后,将每个值运行到一个新声明的字符串中,例如 'thestring'

thestring = ""
for i in range(0,len(k)):
    thestring += k[i]
print(thestring)

因此,所有Pandas列“text”中的字符串已被放入一个字符串变量中。

祝好, Fairuz


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接