Python 如何编写pandas或dask函数以获得以下输出?
我想根据以下条件创建“条件”列:Python 如何编写pandas或dask函数以获得以下输出?,python,python-3.x,pandas,dask,Python,Python 3.x,Pandas,Dask,我想根据以下条件创建“条件”列: 如果“唯一组”有A和B,则整个组的条件为真 可以有单个a和多个B,反之亦然,条件仍然为真 如果存在A而没有B,或者反之亦然,则整个“唯一组”的条件为False 我有一个粗略的想法,一旦我得到了唯一的组和相应的条件,我就可以执行合并,将“条件”得到所有相同的组id,但我不知道如何获得单个/特定组id本身的条件。这里有一个解决方案,使用transform: def check_a_b(ser): s = set(ser) if "A" in s
- 如果“唯一组”有A和B,则整个组的条件为真
- 可以有单个a和多个B,反之亦然,条件仍然为真
- 如果存在A而没有B,或者反之亦然,则整个“唯一组”的条件为False
我有一个粗略的想法,一旦我得到了唯一的组和相应的条件,我就可以执行合并,将“条件”得到所有相同的组id,但我不知道如何获得单个/特定组id本身的条件。这里有一个解决方案,使用transform:
def check_a_b(ser):
s = set(ser)
if "A" in s and "B" in s:
return [True] * len(ser)
else:
return [False] * len(ser)
df["condition"] = df.groupby("Unique Group")["Name"].transform(check_a_b)
结果是:
ID Unique Group Name condition
0 0 4133 D True
1 1 4133 A True
2 2 4133 B True
3 3 4133 C True
4 4 3187 A False
5 5 3187 A False
6 6 3187 C False
7 7 5788 A True
8 8 5788 B True
不需要创建任何简单的pythonic集合,就像Pandas一样 有自己的方法来处理此类案件 也没有必要“乘以”答案。 由于广播功能,熊猫们自己做, 因此,传递给transform的函数可以返回一个单个值 因此,一个比另一个答案简单得多的解决方案是:
df['condition'] = df.groupby('Unique Group').Name.transform(
lambda grp: grp.str.contains('A').any() and grp.str.contains('B').any())
另一方面,另一种解决方案运行速度比我的快。
您可以选择在您的案例中应用哪一个。对于
pandas
和dask
请尝试
df1 = df.groupby('Unique Group')['Name'].apply(list).reset_index()
df2 = df.merge(df1, how='left', on='Unique Group', suffixes=('', '_y'))
df2['Temp'] = True
df2['CONDITION'] = df2['Temp'][df2['Name_y'].apply(lambda x: 'A' in x and 'B' in x)]
df2['CONDITION'] = df2['CONDITION'].fillna(False)
df2 = df2.drop(['Temp', 'Name_y'], axis=1)
据我所知,您不能将.transform
和np.where()
与Dask
一起使用。。。因此,额外的代码
只为熊猫。。。尝试使用.tranform
,.join
,str.split
,最后使用np.where
df['CONDITION'] = df.groupby('Unique Group')['Name'].transform(lambda x: ','.join(x)).str.split(',')
df['CONDITION'] = np.where((df['CONDITION'].apply(lambda x: 'A' in x and 'B' in x)), True, False)
更新:每个评论的dask答案。。。不确定您的所有数据都发生了什么,但从提供的示例数据来看,它是有效的,但我确实收到了一条警告消息。。。为了安全起见,您应该使用
meta=('ID':'int64','Unique Group':'int64','Name':'object','Condition':'bool')
或任何您想要的数据类型为列指定数据类型
(1)为什么这与达斯克有关,而不仅仅与熊猫有关?(2) 如果你有一个“a”和一个“B”怎么办?我猜这种情况是真的?@Roy2012如果dask有很多数据无法用pandas读入内存,或者是处于临界状态,并且在几个函数、数据帧等之后很快就耗尽内存,那么这很可能与dask有关。@DavidErickson是的,你是对的。我有二十多万张唱片。我尝试了2012年的Roy2012和Valdi_Bo的答案,它们似乎对熊猫很有效。我只是想试试你的答案。我会试着让你知道的。嘿,大卫,我用dask尝试了你的答案,我得到了以下错误TypeError:type'float'的参数不可编辑。Vaibhav让我用dask试试。我只是在没有测试的情况下写作,为我工作。请参阅更新的答案。你能逐行运行并告诉我你在哪里收到错误吗?
df['CONDITION'] = df.groupby('Unique Group')['Name'].transform(lambda x: ','.join(x)).str.split(',')
df['CONDITION'] = np.where((df['CONDITION'].apply(lambda x: 'A' in x and 'B' in x)), True, False)