dataframe应用str.contains+将多列连接成一列

写在最前面

原文发布时间:2022-11-15 11:24:56
原文质量分过低,因此进行完善

原文

python - ‘dataframe’ 对象没有属性 ‘str’ 问题

参考链接:https://www.coder.work/article/3136827

我正在尝试删除包含某些字符串的行。但是,我收到错误:

pandas - ‘dataframe’ object has no attribute ‘str’ error.

我怎样才能解决这个问题?

最佳答案

第一个问题应该是重复的列名,所以在选择 colB 之后不要Series , 但是 DataFrame :

df = pd.DataFrame([['Example: s', 'as', 2], ['dd', 'aaa', 3]], columns=['colB','colB','colC'])
print (df)
         colB colB  colC
0  Example: s   as     2
1          dd  aaa     3

print (df['colB'])
         colB colB
0  Example: s   as
1          dd  aaa

#print (df['colB'].str.contains('Example:'))
#>AttributeError: 'DataFrame' object has no attribute 'str'

解决方案应该是将列连接在一起:

print (df['colB'].apply(' '.join, axis=1))
0    Example: s as
1           dd aaa
df['colB'] = df.pop('colB').apply(' '.join, axis=1)
df = df[~df['colB'].str.contains('Example:')] 
print (df)
   colC    colB
1     3  dd aaa

sad,我又报错了

Python基础-TypeError:takes 2 positional arguments but 3 were given

因此我需要换种方法将多列合并成一列
参考链接:https://blog.csdn.net/weixin_42782150/article/details/103668814

df['ColumnA'] = df[df.columns[1:]].apply(
    lambda x: ','.join(x.dropna()),
    axis=1)   # ”1:“表示合并第一列之后的各列为一列

我的代码:

df['ColumnA'] = df[df.loc[:,['A','B','C']]].apply(
    lambda x: ','.join(x.dropna()),axis=1)   # ”1:“表示合并第一列之后的各列为一列

再次报错:

python .loc ValueError: Boolean array expected for the condition, not object

在这里插入图片描述

最后将我的代码改为

df1 = df[['A','B','C']]
df1['ColumnA'] = df1[df1.columns[1:]].apply(
    lambda x: ','.join(x.dropna()),axis=1)   # ”1:“表示合并第一列之后的各列为一列

噢终于解决了,ending

完善:深入理解DataFrame:str.contains() 和 多列连接

在数据分析和数据处理中,Pandas库是一个强大的工具。Pandas的DataFrame结构允许我们以表格形式组织数据,进行各种数据操作。在本文中,我们将深入探讨如何使用Pandas的str.contains()方法来进行字符串匹配和过滤,以及如何将多列数据连接成一列,以满足特定的需求。

1. 数据准备

首先,让我们创建一个示例DataFrame,以便演示str.contains()和多列连接的操作。我们将使用以下示例数据:

import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella'],
    'City': ['New York', 'Los Angeles', 'Chicago', 'San Francisco', 'Las Vegas'],
    'Email': ['alice@example.com', 'bob@gmail.com', 'charlie@example.com', 'david@yahoo.com', 'ella@gmail.com']
}

df = pd.DataFrame(data)

这个DataFrame包含了姓名(‘Name’)、城市(‘City’)、和电子邮件(‘Email’)三列数据。

2. 使用 str.contains() 进行字符串匹配和过滤

有时,我们需要根据某列中的字符串内容进行过滤或筛选。Pandas的str.contains()方法非常有用,可以帮助我们实现这一目标。下面是如何使用str.contains()方法来筛选出包含特定字符串的行:

# 筛选出包含 'New' 的城市
new_york = df[df['City'].str.contains('New', case=False)]
print("包含 'New' 的城市:\n", new_york)

在上面的示例中,我们使用str.contains()方法筛选出了城市列中包含’New’的行,并将结果存储在new_york DataFrame中。请注意,case=False参数用于忽略大小写,因此不区分大小写的字符串也会被匹配。

3. 多列连接成一列

有时,我们需要将多列数据连接成一列,以满足特定的需求。这在创建新特征或简化数据时非常有用。我们可以使用Pandas的.apply()方法来实现这一目标。

下面是一个示例,演示如何将名字(‘Name’)和城市(‘City’)两列连接成一个全名的新列:

# 将 'Name' 和 'City' 列连接成 'Full Name' 列
df['Full Name'] = df.apply(lambda row: f"{row['Name']} from {row['City']}", axis=1)
print("连接后的DataFrame:\n", df)

在上面的示例中,我们使用.apply()方法以行为单位应用了一个lambda函数,将’Name’和’City’两列连接成一个新列’Full Name’。

4. 完整代码

以下是完整的示例代码,包括数据准备、str.contains()的使用以及多列连接:

import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella'],
    'City': ['New York', 'Los Angeles', 'Chicago', 'San Francisco', 'Las Vegas'],
    'Email': ['alice@example.com', 'bob@gmail.com', 'charlie@example.com', 'david@yahoo.com', 'ella@gmail.com']
}

df = pd.DataFrame(data)

# 使用 str.contains 进行字符串匹配和过滤
new_york = df[df['City'].str.contains('New', case=False)]
print("包含 'New' 的城市:\n", new_york)

# 将 'Name' 和 'City' 列连接成 'Full Name' 列
df['Full Name'] = df.apply(lambda row: f"{row['Name']} from {row['City']}", axis=1)
print("连接后的DataFrame:\n", df)

5. 结论

在数据处理中,字符串匹配和多列连接是常见的操作。Pandas库提供了强大的工具来执行这些任务,包括str.contains()方法和.apply()方法。通过学习并掌握这些技巧,您可以更好地处理和分析数据,满足不同的需求。希望本文的示例代码和解释对您的数据分析工作有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Yu欸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值