我正在清理描述如下所示的層次結構的混亂數據源。我正在使用Python和熊貓。有條件地將列A,B,C中的值替換爲列D中的值
¦ A ¦ B ¦ C ¦ D ¦
-----------------
¦ x ¦ ¦ ¦ a ¦
¦ ¦ x ¦ ¦ b ¦
¦ ¦ ¦ x ¦ c ¦
¦ ¦ ¦ x ¦ d ¦
¦ x ¦ ¦ ¦ e ¦
¦ ¦ x ¦ ¦ f ¦
¦ ¦ ¦ x ¦ g ¦
¦ ¦ ¦ x ¦ h ¦
我想生成唯一的ID也保持數據的層次性質。 (每父名稱是唯一的,不注重這部分請。)
¦ A ¦ B ¦ C ¦ D ¦ ID ¦
-------------------------
¦ x ¦ ¦ ¦ a ¦ a ¦
¦ ¦ x ¦ ¦ b ¦ a.b ¦
¦ ¦ ¦ x ¦ c ¦ a.b.c ¦
¦ ¦ ¦ x ¦ d ¦ a.b.d ¦
¦ x ¦ ¦ ¦ e ¦ e ¦ <-- note, this is NOT e.b.d,
¦ ¦ x ¦ ¦ f ¦ e.f ¦ so when parent changes
¦ ¦ ¦ x ¦ g ¦ e.f.g ¦ fillna must not be applied
¦ ¦ ¦ x ¦ h ¦ e.f.h ¦
我的策略是:
- 與值從d 取代A,B,C 'X' 值
- 使用大熊貓轉發NA填充
- 串連A,B和C進入塔ID
2和3是容易的,但我無法通過1.我可以代替X-ES與單個值:
df[df.loc[:,'A':'C'] == 'x'] = 1
但如果我嘗試通過df.D
而不是1
不起作用。
請推薦一款優雅的pythonic解決方案。
源工作,並具:
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
import pandas as pd
TESTDATA=StringIO("""
A;B;C;D;solution
x;;;x;x
;x;;a;xa
;x;;b;xb
;x;;c;xc
;;x;1;xc1
;;x;2;xc2
;x;;d;xd
;;x;3;xd3
;;x;4;xd4
x;;;y;y
;x;;e;ye
;;x;5;ye5
;;x;6;ye6
;x;;f;yf
;;x;7;yf7
;;x;8;yf8
;;x;9;yf9""")
df = pd.read_csv(TESTDATA, sep=";", header=False)
你可以給你輸入'df'嗎? –
是的,謝謝你的建議 –
例如,你的數據框的第6行的結果是什麼? –