如何将值列表中的新列附加到 pandas groupby 对象
How to append new columns to a pandas groupby object from a list of values
我想编写一个脚本,从列中获取系列值,将它们拆分为字符串,并为每个结果字符串创建一个新列(现在用 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
我最终想要的是:
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
我的代码目前是这样的:
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)
我的想法是,代码循环遍历每个分组对象的 Column2,以逗号分隔 frame
中包含的值,并为该组创建一个列表。到目前为止,代码工作正常。然后我添加了
for value in Genes:
string = value
x[string] = np.nan
return x
目的是为列表 Genes
中包含的每个值添加一个新列。但是,我的输出如下所示:
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
我几乎被吓傻了。有人可以解释为什么只附加一列(甚至没有以第一组的第一个列表中的第一个值命名)并建议我如何改进我的代码吗?
我认为你只是 return
在你的函数中太早了,在两个循环结束之前。如果你像这样缩进两次:
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
我想编写一个脚本,从列中获取系列值,将它们拆分为字符串,并为每个结果字符串创建一个新列(现在用 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
我最终想要的是:
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
我的代码目前是这样的:
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)
我的想法是,代码循环遍历每个分组对象的 Column2,以逗号分隔 frame
中包含的值,并为该组创建一个列表。到目前为止,代码工作正常。然后我添加了
for value in Genes:
string = value
x[string] = np.nan
return x
目的是为列表 Genes
中包含的每个值添加一个新列。但是,我的输出如下所示:
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
我几乎被吓傻了。有人可以解释为什么只附加一列(甚至没有以第一组的第一个列表中的第一个值命名)并建议我如何改进我的代码吗?
我认为你只是 return
在你的函数中太早了,在两个循环结束之前。如果你像这样缩进两次:
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