繁体   English   中英

操作熊猫数据框中的一列

[英]Manipulating a column in pandas dataframe

我有一个熊猫数据框,如下所示:

data = {'A' : [1,2,3], 
        'B' : [2,17,17], 
        'C1' : ["C1", np.nan,np.nan],
        'C2' : ["C2", "C2",np.nan]} 

# Create DataFrame 
df = pd.DataFrame(data) 

数据框:

    A   B   C1  C2
0   1   2   C1  C2
1   2   17  NaN C2
2   3   17  NaN NaN

我正在根据以下逻辑和代码创建一个变量“C”

如果 C's(C1, C2, C3..) 中的任何一个具有值 "C" = 来自 C's(C1, C2, C3....) 的值。

df['C'] = df.filter(regex='C\d+').stack().groupby(level=0).agg(','.join)

结果:

    A   B   C1  C2  C
0   1   2   C1  C2  C1,C2
1   2   17  NaN C2  C2
2   3   17  NaN NaN NaN

现在,我想执行以下逻辑

如果“C”对于任何行有 1 个以上的值(比如 C1、C2),则创建一个新行并附加第二个值。 所以我希望我的输出如下所示:

    A   B   C1  C2  C
0   1   2   C1  C2  C1
0   1   2   C1  C2  C2
1   2   17  NaN C2  C2
2   3   17  NaN NaN NaN

我们可以通过使用explode然后concat来做到这一点

s=df.filter(regex='C\d+').stack().groupby(level=0).agg(list).explode().to_frame('C').join(df)
s=pd.concat([s,df[~df.index.isin(s.index)]],axis=0,join='outer',ignore_index=True,sort=False)
s
Out[62]: 
     C  A   B   C1   C2
0   C1  1   2   C1   C2
1   C2  1   2   C1   C2
2   C2  2  17  NaN   C2
3  NaN  3  17  NaN  NaN

你可以这样做:

 df.merge(df.melt(['A','B'],value_name= 'C').dropna().drop('variable',axis = 1),how = "left")
   A   B   C1   C2    C
0  1   2   C1   C2   C1
1  1   2   C1   C2   C2
2  2  17  NaN   C2   C2
3  3  17  NaN  NaN  NaN

你可以只是df.explode(...) ,尝试:

#please note I aggregate it into list, not string
df['C'] = df.filter(regex='C\d+').stack().groupby(level=0).agg(list)

df=df.explode("C")

输出:

   A   B   C1   C2    C
0  1   2   C1   C2   C1
0  1   2   C1   C2   C2
1  2  17  NaN   C2   C2
2  3  17  NaN  NaN  NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM