Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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 groupby对象_Python_Pandas_Group By_Iteration_Dataframe - Fatal编程技术网

Python 如何从值列表中将新列附加到pandas groupby对象

Python 如何从值列表中将新列附加到pandas groupby对象,python,pandas,group-by,iteration,dataframe,Python,Pandas,Group By,Iteration,Dataframe,我想编写一个脚本,从列中获取序列值,将它们拆分为字符串,并为每个结果字符串生成一个新列(现在用NaN填充)。因为df是groupedbyColumn1,所以我想对每个组都这样做 我的输入数据框如下所示: df1: Column1 Column2 0 L17 a,b,c,d,e 1 L7 a,b,c 2 L6 a,b,f 3 L6 h,d,e def NewCols(x): f

我想编写一个脚本,从列中获取序列值,将它们拆分为字符串,并为每个结果字符串生成一个新列(现在用NaN填充)。因为df是
groupedby
Column1,所以我想对每个组都这样做

我的输入数据框如下所示:

df1:
      Column1 Column2   
    0   L17      a,b,c,d,e
    1   L7       a,b,c
    2   L6       a,b,f
    3   L6       h,d,e
def NewCols(x):
    for item, frame in group['Column2'].iteritems():
        Genes = frame.split(',')
        for value in Genes:
            string = value
            x[string] = np.nan
            return x

df1.groupby('Column1').apply(NewCols)
   Column1  Column2    d
0   L17      a,b,c,d,e nan
1   L7       a,b,c     nan
2   L6       a,b,f     nan
3   L6       h,d,e     nan
我最后想要的是:

       Column1  Column2     a   b   c   d   e   f   h
    0   L17      a,b,c,d,e  nan nan nan nan nan nan nan
    1   L7       a,b,c      nan nan nan nan nan nan nan
    2   L6       a,b,f      nan nan nan nan nan nan nan
我的代码当前如下所示:

df1:
      Column1 Column2   
    0   L17      a,b,c,d,e
    1   L7       a,b,c
    2   L6       a,b,f
    3   L6       h,d,e
def NewCols(x):
    for item, frame in group['Column2'].iteritems():
        Genes = frame.split(',')
        for value in Genes:
            string = value
            x[string] = np.nan
            return x

df1.groupby('Column1').apply(NewCols)
   Column1  Column2    d
0   L17      a,b,c,d,e nan
1   L7       a,b,c     nan
2   L6       a,b,f     nan
3   L6       h,d,e     nan
我的想法是,代码循环遍历每个分组对象的第2列,以逗号分隔
frame
中包含的值,并为该组创建一个列表。到目前为止,代码运行良好。然后我补充说

for value in Genes:
   string = value
   x[string] = np.nan
   return x
旨在为列表中包含的每个值添加一个新列
Genes
。但是,我的输出如下所示:

df1:
      Column1 Column2   
    0   L17      a,b,c,d,e
    1   L7       a,b,c
    2   L6       a,b,f
    3   L6       h,d,e
def NewCols(x):
    for item, frame in group['Column2'].iteritems():
        Genes = frame.split(',')
        for value in Genes:
            string = value
            x[string] = np.nan
            return x

df1.groupby('Column1').apply(NewCols)
   Column1  Column2    d
0   L17      a,b,c,d,e nan
1   L7       a,b,c     nan
2   L6       a,b,f     nan
3   L6       h,d,e     nan

我简直是哑口无言。有人能解释一下为什么只追加了一列(甚至没有以第一组的第一个列表中的第一个值命名),并建议我如何改进代码吗?

我认为您在函数中返回的时间太早了,在两个循环结束之前。如果像这样缩进两次:

def NewCols(x):
    for item, frame in group['Column2'].iteritems():
        Genes = frame.split(',')
        for value in Genes:
            string = value
            x[string] = np.nan
    return x

UngroupedResGenesLineage.groupby('Column1').apply(NewCols)
它应该很好用

cols = sorted(list(set(df1['Column2'].apply(lambda x: x.split(',')).sum())))
df = df1.groupby('Column1').agg(lambda x: ','.join(x)).reset_index()
pd.concat([df,pd.DataFrame({c:np.nan for c in cols}, index=df.index)], axis=1)

    Column1 Column2     a   b   c   d   e   f   h
0   L17     a,b,c,d,e   NaN NaN NaN NaN NaN NaN NaN
1   L6      a,b,f,h,d,e NaN NaN NaN NaN NaN NaN NaN
2   L7      a,b,c       NaN NaN NaN NaN NaN NaN NaN