我確信以前有人問過這樣的問題,但我目前的搜索嘗試沒有找到解決方案。
我有一列文本值,例如:
import pandas as pd
df2 = pd.DataFrame({'text':['a','bb','cc','4','m','...']})
print(df2)
text
0 a
1 bb
2 cc
3 4
4 m
5 ...
'text' 中的列由字串、整數、浮點數和 nan 型別資料組成。
我試圖組合(每個文本值之間有一個空格 [' '] )文本列中每個數字(整數/浮點數)之間的所有文本值,忽略 Nan 值,使每個串聯設定單獨的行。
實作這一目標的最有效方法是什么?
我認為可能將所有值讀入一個字串,去除 Nan 的值,然后在遇到數字時連續拆分它,但這似乎效率極低。
謝謝您的幫助!
編輯:
所需的樣本輸出
text
0 'a bb cc'
1 'm ...'
uj5u.com熱心網友回復:
您可以將列轉換為數字并測驗非缺失值,因此True為數字行獲取s,然后僅過濾倒置掩碼中的非數字 by ~inDataFrame.loc并通過累積總和與 mask by Series.cumsumwith aggregate 進行聚合join:
#for remove NaNs before solution
df2 = df2.dropna(subset=['text'])
m = pd.to_numeric(df2['text'], errors='coerce').notna()
df = df2.loc[~m, 'text'].groupby(m.cumsum()).agg(' '.join).reset_index(drop=True).to_frame()
print (df)
text
0 a bb cc
1 m ...
uj5u.com熱心網友回復:
我會完全避免使用熊貓進行此操作。相反,使用庫模塊more_itertools- 即split_at()函式:
import more_itertools as mit
def test(x): # Test if X is a number of some sort or a nan
try: float(x); return True
except: return False
result = [" ".join(x) for x in mit.split_at(df2['text'].dropna(), test)]
# ['a bb cc', 'm ...']
df3 = pd.DataFrame(result, columns=['text',])
PS 在平均組長度為 10 的 13,000 行資料幀上,此解決方案比jezrael提出的Pandas解決方案快 2 倍(0.00087 秒與 0.00156 秒)。確實差別不大。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392738.html
