Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写pandas或dask函数以获得以下输出?_Python_Python 3.x_Pandas_Dask - Fatal编程技术网

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)