如何在Python中连接不同的文本行?

2024-09-30 00:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下的数据帧:

Date 1-Jan 2-Jan 3-Jan 4-Jan
Duty
1    Bob   NaN   Bob   NaN
2    NaN   NaN   Bob   Bob
3    NaN   NaN   Bob   Bob

我想要实现的是在每个日期添加最后一行,如果在任何Duty中有Bob,那么值将是“Bob”,如下所示:

Date 1-Jan 2-Jan 3-Jan 4-Jan
Duty
1    Bob   NaN   Bob   NaN
2    NaN   NaN   Bob   Bob
3    NaN   NaN   Bob   Bob
sum  Bob   NaN   Bob   Bob

我尝试使用pd.apply如下:

df.loc['sum'] = df.apply(lambda x: x.sum())

但我得到的结果是:

Date 1-Jan 2-Jan 3-Jan     4-Jan
Duty
1    Bob   NaN   Bob       NaN
2    NaN   NaN   Bob       Bob
3    NaN   NaN   Bob       Bob
sum  NaN   NaN   BobBobBob NaN

我还尝试将每一行分割成几个小的数据帧,并尝试pd.merge()它们也不起作用。你知道吗


Tags: 数据lambdadfdatemergenanlocjan
2条回答

如果每列需要第一个非缺失值,请使用^{}next以及iter作为可能的设置默认值(如果不存在第一个值):

df.loc['sum'] = df.apply(lambda x: next(iter(x.dropna()),np.nan))
print (df)
     1-Jan  2-Jan 3-Jan 4-Jan
Date                         
1      Bob    NaN   Bob   NaN
2      NaN    NaN   Bob   Bob
3      NaN    NaN   Bob   Bob
sum    Bob    NaN   Bob   Bob

或者将^{}^{}一起使用:

df.loc['sum'] = df.stack().groupby(level=1).first()
print (df)
     1-Jan  2-Jan 3-Jan 4-Jan
Date                         
1      Bob    NaN   Bob   NaN
2      NaN    NaN   Bob   Bob
3      NaN    NaN   Bob   Bob
sum    Bob    NaN   Bob   Bob

如果需要测试值Bob

df.loc['sum'] =  df.eq('Bob').any().map({True: 'Bob', False: np.nan})
print (df)
     1-Jan  2-Jan 3-Jan 4-Jan
Date                         
1      Bob    NaN   Bob   NaN
2      NaN    NaN   Bob   Bob
3      NaN    NaN   Bob   Bob
sum    Bob    NaN   Bob   Bob

首先,我们检查每列中的值的any是否等于(eq)到Bob。然后我们append这些值在数据帧的底部,同时映射True > BobFalse > NaN

m = df.eq('Bob').any(axis=0).map({True: 'Bob', False: np.NaN})
df = df.append(pd.DataFrame(m, columns=['sum']).T)

输出

    1-Jan 2-Jan 3-Jan 4-Jan
0     Bob   NaN   Bob   NaN
1     NaN   NaN   Bob   Bob
2     NaN   NaN   Bob   Bob
sum   Bob   NaN   Bob   Bob

相关问题 更多 >

    热门问题