Python 从一列中获取所有不同的值,其中另一列的初始列中的每个值至少有两个不同的值
我有一个非常大的数据集(20GB+),我需要从a列中选择所有不同的值,其中B列中至少有两个其他不同的值用于a列中的每个不同值 对于以下数据帧:Python 从一列中获取所有不同的值,其中另一列的初始列中的每个值至少有两个不同的值,python,pandas,Python,Pandas,我有一个非常大的数据集(20GB+),我需要从a列中选择所有不同的值,其中B列中至少有两个其他不同的值用于a列中的每个不同值 对于以下数据帧: | A | B | |---|---| | x | 1 | | x | 2 | | y | 1 | | y | 1 | 应该只返回x,因为它在列B上有两个不同的值,而y只有一个不同的值 下面的代码实现了这一点,但由于数据集非常大,这需要很长的时间(以小时为单位): def get_values(list_of_distinct_values, data
| A | B |
|---|---|
| x | 1 |
| x | 2 |
| y | 1 |
| y | 1 |
应该只返回x,因为它在列B上有两个不同的值,而y只有一个不同的值
下面的代码实现了这一点,但由于数据集非常大,这需要很长的时间(以小时为单位):
def get_values(list_of_distinct_values, dataframe):
valid_values = []
for value in list_of_distinct_values:
value_df = dataframe.loc[dataframe['A'] == value]
if len(value_df.groupby('B')) > 1:
valid_values.append(value)
return valid_values
有人能提出一种更快的方法吗?我想你可以用数据帧的方法
drop\u duplicates()
来解决你的问题。您需要使用参数子集
和保留
(删除所有重复的行):
我不知道这是否会更快,但值得一试,因为它不涉及迭代:
valid_values=df.groupby('a').agg({'B':'nunique'))
,valid_values=valid_values[valid_values['B']>=2]
@Jacob-谢谢。它确实起作用了,而且速度快得多。
import pandas as pd
df = pd.DataFrame({
'A': ["x", "x", "y", "y"],
'B': [1, 2, 1, 1],
})
df.drop_duplicates(subset=['A', 'B'], keep=False).drop_duplicates(subset=['A'])['A']