python Dataframe 根据某一列的值来删除多行

Python Dataframe高效删除行:依据列值筛选
本文介绍了两种快速删除Python pandas DataFrame中特定列值对应行的方法:使用`~df.b.isin(my_list)`和`df.query('@my_list not in b')`。这两种方法在处理大量数据时比循环删除index的方法效率更高,适合大数据场景。通过实例展示了如何根据列表`my_list`过滤掉DataFrame中'abc'列值在列表内的行。

python Dataframe 根据某一列的值来删除多行

在Dataframe中,有的时候想根据某一列值来删除。

方法一:你可以做负isin()索引:

In [57]: df
Out[57]:
   a  b  c
0  1  2  2
1  1  7  0
2  3  7  1
3  3  2  7
4  1  3  1
5  3  4  2
6  0  7  1
7  5  4  3
8  6  1  0
9  3  2  0
In [58]: my_list = [1, 7, 8]

In [59]: df.loc[~df.b.isin(my_list)]
Out[59]:
   a  b  c
0  1  2  2
3  3  2  7
4  1  3  1
5  3  4  2
7  5  4  3
9  3  2  0

方法二:query

In [60]: df.query('@my_list not in b')
Out[60]:
   a  b  c
0  1  2  2
3  3  2  7
4  1  3  1
5  3  4  2
7  5  4  3
9  3  2  0

以前我使用的笨方法是循环删index的方法,在drou_index操作,当数据特别大的时候,特别慢。
换成上面的方法,速度很快!
人生苦短,我用python!!!

<think> 我们参考多个引用内容,特别是引用[2]和引用[3]提供的方法,来处理将DataFrame中的一根据分隔符拆分成多行的需求。 引用[2]中展示的方法是:先使用split分割字符串,然后使用stack()来展开,最后与原数据合并。 引用[3]中展示了两种方法:一种是用split分割并展开为多,然后使用explode方法将多中的表拆分多行(注意:在引用[3]的示例中,拆分成多后,再使用explode方法,但实际上在pandas 0.25版本之后,可以直接使用explode方法将包含表的拆分成多行)。 根据用户需求,我们只需要将一拆分成多行(而不是拆成多再拼接),因此我们可以采用以下步骤: 1. 使用split方法将需要拆分的分割成表(注意:这里不展开成多,而是生成一个)。 2. 使用explode方法将中的每个元素拆分成一。 具体步骤如下(以引用[3]中的例子说明): 原始数据: A B C 0 a1 a2 a3_a4 1 b4 b5 b6_b7 我们需要将C按照分隔符'_'进拆分,使得每一在C上的一个元素变成一,同时保留其他。 步骤: 1. 将C转换成表:使用apply或map函数配合split。 df['C'] = df['C'].str.split('_') # 这样C将变成表,例如第一变成['a3','a4'] 2. 使用explode方法将表拆分成多行: df = df.explode('C') 这样,第一会拆分成两:一C为'a3',另一C为'a4',同时A和B会重复。 注意:在pandas 0.25.0及以上版本支持explode方法。如果版本较低,则需要使用其他方法(如引用[2]中的方法)。 引用[2]中的方法(适用于低版本): df = ( df.drop('C', axis=1) # 先删除C .join( # 然后将拆分后的结果与剩余部分连接 df['C'].str.split(' ', expand=True) # 注意:这里引用[2]中用的是空格分隔,我们根据实际情况改成对应分隔符 .stack() # 堆叠,将多变成多行 .reset_index(level=1, drop=True) # 重置索引,删除多余的索引 .rename('C') # 重命名 ) ) 但用户的问题中并没有指定分隔符是什么,假设是空格或者下划线,我们可以根据实际情况调整。 为了通用性,我们以用户提供的分隔符为准(假设为逗号',',但问题中没有给出,所以需要用户自替换)。在下面的示例中,我们假设分隔符是下划线'_'。 因此,我们推荐使用explode方法(简洁高效),但也要注意版本要求。 下面给出两种方法的代码示例: 方法一(推荐,使用explode,要求pandas>=0.25.0): 步骤: df['需要拆分的'] = df['需要拆分的'].str.split(分隔符) df_exploded = df.explode('需要拆分的') 方法二(适用于低版本): 步骤: # 注意:这里我们参考引用[2]的方法,但原文中分隔符是空格,我们替换成实际分隔符 split_df = df['需要拆分的'].str.split(分隔符, expand=True) # 分割成多 # 然后将多堆叠(stack)成一列,这样每就会变成多行 stacked = split_df.stack().reset_index(level=1, drop=True).rename('需要拆分的') # 删除DataFrame中需要拆分的,并与堆叠后的结果连接 df_exploded = df.drop('需要拆分的', axis=1).join(stacked) 下面我们用一个具体例子(分隔符为'_')来演示两种方法。 原始数据: import pandas as pd df = pd.DataFrame({ 'A': ['a1', 'b4'], 'B': ['a2', 'b5'], 'C': ['a3_a4', 'b6_b7'] }) 目标:将C按'_'拆分,使得每一拆成两(因为有两个元素),得到: A B C 0 a1 a2 a3 0 a1 a2 a4 # 注意索引重复,可以使用reset_index重置索引 1 b4 b5 b6 1 b4 b5 b7 方法一代码: df['C'] = df['C'].str.split('_') df_exploded = df.explode('C').reset_index(drop=True) # reset_index可以重置索引,避免重复索引 方法二代码: split_df = df['C'].str.split('_', expand=True) stacked = split_df.stack().reset_index(level=1, drop=True).rename('C') df_exploded = df.drop('C', axis=1).join(stacked).reset_index(drop=True) 注意:两种方法得到的df_exploded可能会有不同的索引,我们使用reset_index(drop=True)重置索引。 根据用户需求,我们推荐使用explode方法(方法一),因为它更简洁。但请确保pandas版本足够。 因此,我们给出最终解决方案: 步骤: 1. 将需要拆分的使用split函数按照分隔符分割成表。 2. 使用explode方法将该拆分成多行。 3. 可选:重置索引。 代码示例: import pandas as pd # 假设df是原始DataFrame,分隔符为sep(比如'_') # 假设要拆分的名为'column_name' df['column_name'] = df['column_name'].str.split(sep) df = df.explode('column_name').reset_index(drop=True) 注意:如果原始中可能包含空(NaN)或者非字符串类型,需要先处理(例如填充空或转换为字符串)。 此外,如果拆分后需要同时拆分多个,则需要分别处理,但explode一次只能处理一列(但可以连续调用explode处理多,但要小心笛卡尔积)。 如果需要同时根据拆分,且这些的分隔符相同,并且每拆分的元素个数相同,那么可以分别拆分然后合并。但这种情况较少,通常我们一次只拆分一列。 因此,针对用户的需求,我们提供上述解决方案。 下面生成相关问题。 </think> ### Python DataFrame根据分隔符将一拆分成多行 在Pandas中,根据分隔符将一数据拆分成多行数据有两种主流方法,核心步骤和示例如下: #### 方法一:使用`str.split()` + `explode()`(推荐) ```python import pandas as pd # 原始数据 df = pd.DataFrame({ 'A': ['a1', 'b4'], 'B': ['a2', 'b5'], 'C': ['a3_a4', 'b6_b7_b8'] # 需要拆分的 }) # 拆分步骤 df['C'] = df['C'].str.split('_') # 按分隔符'_'分割成表 df = df.explode('C').reset_index(drop=True) # 展开表为多行 ``` **输出结果**: | | A | B | C | |-----|-----|-----|-----| | 0 | a1 | a2 | a3 | | 1 | a1 | a2 | a4 | | 2 | b4 | b5 | b6 | | 3 | b4 | b5 | b7 | | 4 | b4 | b5 | b8 | #### 方法二:使用`str.split()` + `stack()`(兼容旧版本) ```python # 拆分步骤 split_col = ( df['C'].str.split('_', expand=True) # 分割成多 .stack() # 转换为垂直方向的多行 .reset_index(level=1, drop=True) # 删除多余索引 .rename('C') # 重命名 ) result = df.drop('C', axis=1).join(split_col) # 拼接结果 ``` #### 关键说明: 1. **分隔符处理**:将目标(如`C`)通过`str.split('分隔符')`转换为表 2. **展开**: - `explode()`(Pandas 0.25+)直接展开表为多行[^3] - `stack()`通过堆叠实现多多行[^2] 3. **索引重置**:`reset_index(drop=True)`避免索引重复 4. **空处理**:拆分时遇到空可用`df['col'].fillna('')`预处理 > **适用场景**:处理地址、标签、多属性等字段(如`"北京,上海,广州"`拆分为三)[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值