![](/img/trans.png)
[英]Python Pandas - How do I join DataFrames on indices with different number of levels?
[英]How do I Join different lines of text in Pandas 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
我還嘗試將每一行分成幾個小的 Dataframe 並嘗試pd.merge()
它們,這也不起作用。
首先,我們檢查每列中的any
值是否與Bob
相等 ( eq
)。 然后我們append
這些值append
到數據框的底部,同時映射True > Bob
和False > 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
如果每列需要第一個非缺失值,請使用Series.dropna
和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
或者將DataFrame.stack
與GroupBy.first
DataFrame.stack
使用:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.