![](/img/trans.png)
[英]Replacing specific column values after removing duplicates in a pandas dataframe
[英]Replacing dataframe values after removing/replacing character in rows using Pandas
我有一個數據df_in
像這樣:
import pandas as pd
import numpy as np
dic_in = {'A':['aa','bb','cc','dd','ee','ff','gg','uu','xx','yy','zz'],
'B':['200','200','AA200','AA040',np.nan,'500',np.nan,'0700','900','UKK','200'],
'C':['UNN','400',np.nan,'AA080','AA800','B',np.nan,'400',np.nan,'500','UKK']}
我的目標是以下列方式調查B
和C
欄:
'AA'
,則必須刪除字符串中此類部分的數字,僅保留數字部分。 ( AA123 ---> 123
)。 如果在第一個非null元素之前存在零,則必須將其刪除( AA001234 ---> 1234
)。 0.0
( NaN ---> 0.0
, UNN ----> 0.0
, UKK ---> 0.0
等)。 070--->700
00007000--->7000
) 100
。 最終結果應如下所示:
# BEFORE # # AFTER #
A B C A B C
0 aa 200 UNN 0 aa 200 0.0
1 bb 200 400 1 bb 200 400
2 cc AA200 NaN 2 cc 20000 0.0
3 dd AA040 AA080 3 dd 4000 8000
4 ee NaN AA800 4 ee 0.0 80000
5 ff 500 B 5 ff 500 0.0
6 gg NaN NaN 6 gg 0.0 0.0
7 uu 0700 400 7 uu 700 400
8 xx 900 NaN 8 xx 900 0.0
9 yy UKK 500 9 yy 0.0 500
10 zz 200 UKK 10 zz 200 0.0
您知道實現這一目標的明智而有效的方法嗎?
注意 :所有數字實際上都是字符串,應該保持原樣。
您可以使用to_numeric
將非數字替換為NaN
。
然后從字符串中extract
數字,將lstrip
左邊的0
刪除,然后添加00
。
最后將combine_first
與fillna
並分配給列:
b = pd.to_numeric(df_in.B, errors='coerce')
c = pd.to_numeric(df_in.C, errors='coerce')
b1 = df_in.B.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'
c1 = df_in.C.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'
df_in.B = b.combine_first(b1).fillna(0)
df_in.C = c.combine_first(c1).fillna(0)
print (df_in)
A B C
0 aa 200 0
1 bb 200 400
2 cc 20000 0
3 dd 4000 8000
4 ee 0 80000
5 ff 500 0
6 gg 0 0
7 uu 700 400
8 xx 900 0
9 yy 0 500
10 zz 200 0
字符串0.0
最后一個fillna
的位修改后的解決方案將所有值轉換為字符串(避免使用某些字符串和某些數字值):
b = pd.to_numeric(df_in.B, errors='coerce')
c = pd.to_numeric(df_in.C, errors='coerce')
b1 = df_in.B.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'
c1 = df_in.C.str.extract('(\d+)', expand=False).str.lstrip('0') + '00'
df_in.B = b.combine_first(b1)
df_in.C = c.combine_first(c1)
df_in = df_in.fillna('0.0').astype(str)
print (df_in)
A B C
0 aa 200.0 0.0
1 bb 200.0 400.0
2 cc 20000 0.0
3 dd 4000 8000
4 ee 0.0 80000
5 ff 500.0 0.0
6 gg 0.0 0.0
7 uu 700.0 400.0
8 xx 900.0 0.0
9 yy 0.0 500.0
10 zz 200.0 0.0
假設數據框中的所有值都是字符串(包括NaN
,否則可以使用fillna
將它們轉換為適當的字符串),則可以在要轉換的兩列applymap
以下converter
函數與applymap
一起使用。
df = pd.DataFrame(dic_in, dtype=str).fillna('NAN')
converter = lambda x: str(int(x.replace('AA', ''))*100) if 'AA' in x else str(int(x)) if x.isdigit() else '0.0'
df[['B','C']] = df[['B','C']].applymap(converter)
df
內容:
A B C
0 aa 200 0.0
1 bb 200 400
2 cc 20000 0.0
3 dd 4000 8000
4 ee 0.0 80000
5 ff 500 0.0
6 gg 0.0 0.0
7 uu 700 400
8 xx 900 0.0
9 yy 0.0 500
10 zz 200 0.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.