22.缺失值判斷: s.isnull()
isnull()方法可以對缺失值NaN值進行判斷呜叫,返回對Series或DataFrame的每個元素的判定結(jié)果琼掠,存在缺失值。但不能識別空值,空格等埃仪。
notnull()是isnull()的否定式评肆。
In [2]: s=pd.Series(['a','b','c','',' ',np.nan,None])
In [3]: s
Out[3]:
0 a
1 b
2 c
3
4
5 NaN
6 None
dtype: object
In [4]: s.isnull()
Out[4]:
0 False
1 False
2 False
3 False
4 False
5 True
6 True
dtype: bool
#對dataframe進行判斷
In [5]: df=pd.DataFrame([['a','b','c','',' ',np.nan,None],
...: ['E','F',np.nan,'H','I',3,6]],index=['a1','a2']).T
In [6]: df
Out[6]:
a1 a2
0 a E
1 b F
2 c NaN
3 H
4 I
5 NaN 3
6 NaN 6
In [7]: df.isnull()
Out[7]:
a1 a2
0 False False
1 False False
2 False True
3 False False
4 False False
5 True False
6 True False
23.刪除缺失值: s.dropna() / df.dropna()
- dropna()默認會刪除含有缺失值的行或列债查。對于DataFrame,可以通過how='all'來調(diào)節(jié)只刪除所有數(shù)據(jù)均缺失的行列(默認how='any')瓜挽。
- 還可以通過調(diào)節(jié)axis=1參數(shù)來刪除列盹廷。
- 也可以通過thresh參數(shù)來選取最少non-NA值個數(shù)的行選出來(即對每行或列的缺失值進行統(tǒng)計,thresh等于幾就刪除缺失值最多的這幾行或幾列)久橙。
In [8]: s
Out[8]:
0 a
1 b
2 c
3
4
5 NaN
6 None
dtype: object
In [9]: s.dropna()
Out[9]:
0 a
1 b
2 c
3
4
dtype: object
#對于DataFrame俄占,dropna還有可選參數(shù)
In [10]: df2=pd.DataFrame([['a','b','c','',' ',np.nan,None],
...: ['E','F',np.nan,'H','I',3,np.nan]],index=['a1','a2']).T
In [11]: df2
Out[11]:
a1 a2
0 a E
1 b F
2 c NaN
3 H
4 I
5 NaN 3
6 NaN NaN
In [12]: df2.dropna()
Out[12]:
a1 a2
0 a E
1 b F
3 H
4 I
In [13]: df2.dropna(how='all')
Out[13]:
a1 a2
0 a E
1 b F
2 c NaN
3 H
4 I
5 NaN 3
24.填充缺失值: s.fillna() / df.fillna()
- 通過value來給缺失值賦值想要的值
- 通過method參數(shù)來選擇填充方法,ffill或pad表示向前填充(即用前面的一個非缺失值填充)淆衷,backfill或bfill表示向后填充缸榄。
- 還可以利用計算數(shù)據(jù)進行填充,如平均值或中位數(shù)等(df.mean()祝拯、df.median())
In [14]: df2
Out[14]:
a1 a2
0 a E
1 b F
2 c NaN
3 H
4 I
5 NaN 3
6 NaN NaN
#直接填充值
In [15]: df2.fillna(888)
Out[15]:
a1 a2
0 a E
1 b F
2 c 888
3 H
4 I
5 888 3
6 888 888
#使用method參數(shù)
In [16]: df2.fillna(method='ffill')
Out[16]:
a1 a2
0 a E
1 b F
2 c F
3 H
4 I
5 3
6 3
#可以使用計算值填充數(shù)據(jù)
In [17]: df2.fillna(df.count())
Out[17]:
a1 a2
0 a E
1 b F
2 c 6
3 H
4 I
5 5 3
6 5 6
25.重復(fù)值判定: s.duplicated() / df.duplicated()
- duplicated()會返回一個布爾系列碰凶,來判定此行/列在之前是否出現(xiàn)過
In [24]: s2=pd.Series(['A','A','B','b'])
In [25]: s2
Out[25]:
0 A
1 A
2 B
3 b
dtype: object
In [26]: s2.duplicated()
Out[26]:
0 False
1 True
2 False
3 False
dtype: bool
In [27]: df4=pd.DataFrame([['A','A','B','b'],
...: ['A','C','b','b'],
...: ['e','d','f','b'],
...: ['e','d','f','b']],columns=['a1','a2','a3','a4'])
In [28]: df4
Out[28]:
a1 a2 a3 a4
0 A A B b
1 A C b b
2 e d f b
3 e d f b
In [29]: df4.duplicated()
Out[29]:
0 False
1 False
2 False
3 True
dtype: bool
26.刪除重復(fù)值: s.drop_duplicates() / df.drop_duplicates()
- drop_duplicates()可以刪除重復(fù)出現(xiàn)的數(shù)據(jù)
- 通過參數(shù)keep調(diào)節(jié)保留的數(shù)據(jù),keep='first'保留重復(fù)的第一個數(shù)據(jù)鹿驼,keep='last'保留最后一個數(shù)據(jù)欲低,keep=False刪除所有重復(fù)數(shù)據(jù)(只保留沒有重復(fù)的數(shù)據(jù))
- 通過subset參數(shù)可以指定部分列進行重復(fù)判斷,默認為判斷所有列畜晰,指定subset=['colname1','colname2']
- 通過參數(shù)inplace=True可以對數(shù)據(jù)進行原地修改
In [30]: s2
Out[30]:
0 A
1 A
2 B
3 b
dtype: object
In [31]: s2.drop_duplicates()
Out[31]:
0 A
2 B
3 b
dtype: object
In [32]: df4
Out[32]:
a1 a2 a3 a4
0 A A B b
1 A C b b
2 e d f b
3 e d f b
In [33]: df4.drop_duplicates()
Out[33]:
a1 a2 a3 a4
0 A A B b
1 A C b b
2 e d f b
In [34]: df4.drop_duplicates(keep=False)
Out[34]:
a1 a2 a3 a4
0 A A B b
1 A C b b
#指定列進行重復(fù)判斷
In [62]: df4.drop_duplicates(subset=['a1','a4'])
Out[62]:
a1 a2 a3 a4
0 A A B b
2 e d f b
27.數(shù)據(jù)分類(映射): s.map(dict)
使用map()可以利用字典完成對數(shù)據(jù)序列的映射砾莱,在很多工作中會用到,例如對商品進行歸類凄鼻、把代號轉(zhuǎn)換成文字內(nèi)容等腊瑟。
In [13]: df=pd.DataFrame([list('abcdefgh'),
...: [15,24,33,13,53,21,31,91],
...: [1,2,3,4,1,2,2,2]],index=['name','age','city']).T
In [14]: df
Out[14]:
name age city
0 a 15 1
1 b 24 2
2 c 33 3
3 d 13 4
4 e 53 1
5 f 21 2
6 g 31 2
7 h 91 2
#通過字典完成對用戶名單的性別映射
In [15]: sex={'a':'男',
...: 'b':'女',
...: 'c':'男',
...: 'd':'男',
...: 'e':'女',
...: 'f':'男',
...: 'g':'未知',
...: 'h':'男',}
In [16]: df['sex']=df['name'].map(sex)
In [17]: df
Out[17]:
name age city sex
0 a 15 1 男
1 b 24 2 女
2 c 33 3 男
3 d 13 4 男
4 e 53 1 女
5 f 21 2 男
6 g 31 2 未知
7 h 91 2 男
28.替換值: s.replace() / df.replace()
- 可以針對單一值進行替換,如s.replace(oldvalue,newvalue)
- 也可以將多個值替換為同一個值块蚌,如s.replace([oldvalue1,oldvalue2],newvalue)闰非。也可以傳入兩個列表,新舊值一一對應(yīng)進行替換
- 對df執(zhí)行replace操作時應(yīng)特別注意峭范,它會替換掉df中所有符合條件的數(shù)據(jù)财松,保險的做法是df['col']=df['col'].replace([oldlist],[newlist])
In [19]: df
Out[19]:
name age city sex
0 a 15 1 男
1 b 24 2 女
2 c 33 3 男
3 d 13 4 男
4 e 53 1 女
5 f 21 2 男
6 g 31 2 未知
7 h 91 2 男
#將city的代號對應(yīng)到城市名稱
In [20]: df['city']=df['city'].replace([1,2,3,4],['北京','上海','廣州','重慶'])
In [21]: df
Out[21]:
name age city sex
0 a 15 北京 男
1 b 24 上海 女
2 c 33 廣州 男
3 d 13 重慶 男
4 e 53 北京 女
5 f 21 上海 男
6 g 31 上海 未知
7 h 91 上海 男
29.離散化和面元劃分(數(shù)據(jù)分段): pd.cut(s,bins,labels)
- s:待分段數(shù)據(jù)
- bins:分段標準
- labels:分段標簽
- 分段區(qū)間默認為左開右閉,可以通過參數(shù)right=False,修改區(qū)間段為左閉右開區(qū)間辆毡。
- 如果cut傳入的不是面元邊界菜秦,而是面元數(shù)量,則會根據(jù)數(shù)據(jù)的最大最小值計算等長面元舶掖,precision參數(shù)控制面元劃分的小數(shù)位數(shù)球昨。
- qcut,可以根據(jù)樣本分位數(shù)對數(shù)據(jù)進行面元劃分眨攘。
In [13]: ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
...: bins=[10,18,25,45,70,100]
...: labels=['少年','青年','壯年','中年','老年']
...: cats=pd.cut(ages,bins,labels=labels)
In [14]: cats
Out[14]:
[青年, 青年, 青年, 壯年, 青年, ..., 壯年, 中年, 壯年, 壯年, 壯年]
Length: 12
Categories (5, object): [少年 < 青年 < 壯年 < 中年 < 老年]
In [15]: pd.value_counts(cats)
Out[15]:
壯年 6
青年 5
中年 1
老年 0
少年 0
dtype: int64
30.異常值檢測和過濾(替換異常值)
- np.sign(data)可以根據(jù)data的正負符號主慰,生成1和-1
In [17]: data=pd.DataFrame(np.random.randn(1000,4))
In [18]: data.describe()
Out[18]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean 0.004810 -0.027545 -0.045605 -0.016705
std 1.004290 1.021424 0.994457 0.949196
min -3.206029 -3.584745 -3.558081 -2.728175
25% -0.687393 -0.756027 -0.701376 -0.646029
50% 0.052037 -0.061157 -0.062893 0.005118
75% 0.658388 0.672714 0.608198 0.631999
max 3.658853 3.077312 3.619713 2.838411
In [19]: data[(np.abs(data)>3).any(axis=1)]
Out[19]:
0 1 2 3
30 -0.338671 1.377560 -3.052083 1.129186
180 -1.553646 -3.200527 0.753505 1.962077
192 -0.412346 -2.276327 -3.558081 0.434918
254 1.161989 -3.584745 -0.370215 0.353072
321 -0.936188 -1.618777 3.619713 0.517175
338 -0.458360 3.077312 -0.195628 -0.476386
404 -1.335868 -3.073252 0.484003 0.013251
447 -3.116901 1.428209 0.042362 1.424448
518 -0.978763 -0.343995 -3.084647 0.379374
644 3.042225 -1.468389 0.261914 -0.663178
696 3.658853 -1.206324 -0.810575 -1.672725
711 -3.206029 0.454197 -0.214890 0.118297
717 -0.749071 3.075002 0.774330 -0.593757
#將絕對值大于3的數(shù)據(jù)限制在3以內(nèi)
In [20]: data[np.abs(data)>3]=np.sign(data)*3
In [21]: data.describe()
Out[21]:
0 1 2 3
count 1000.000000 1000.000000 1000.000000 1000.000000
mean 0.004432 -0.026839 -0.045529 -0.016705
std 1.000979 1.018271 0.990127 0.949196
min -3.000000 -3.000000 -3.000000 -2.728175
25% -0.687393 -0.756027 -0.701376 -0.646029
50% 0.052037 -0.061157 -0.062893 0.005118
75% 0.658388 0.672714 0.608198 0.631999
max 3.000000 3.000000 3.000000 2.838411
31.計算指標/啞變量(選項的二分法轉(zhuǎn)換): pd.get_dummies()
- df某列包含有k個不同的值,則可以派生出一個k*len(df)的矩陣鲫售,每一行由0,1構(gòu)成共螺,如果該行包含k中的值,則對應(yīng)的列為1龟虎,其余列對應(yīng)值為0。
- 二分法的概念:針對一個英語題沙庐,答案直接記錄為D鲤妥,則稱之為分類法記錄。如果將ABCD答案列為表頭拱雏,分別在下面記錄[0,0,0,1]棉安,表示D選項被選中,即為二分法铸抑。
- prefix參數(shù)可以為指標加上前綴贡耽,方便和其他數(shù)據(jù)結(jié)合。
In [22]: df = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'],
...: 'data1': [1,2,3,4,5,5]})
In [23]: df
Out[23]:
key data1
0 b 1
1 b 2
2 a 3
3 c 4
4 a 5
5 b 5
In [24]: pd.get_dummies(df['key'])
Out[24]:
a b c
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
4 1 0 0
5 0 1 0
#使用prefix添加前綴鹊汛,并合并其他數(shù)據(jù)
In [25]: dummies = pd.get_dummies(df['key'], prefix='key')
...: df[['data1']].join(dummies)
Out[25]:
data1 key_a key_b key_c
0 1 0 1 0
1 2 0 1 0
2 3 1 0 0
3 4 0 0 1
4 5 1 0 0
5 5 0 1 0
32.字符串操作方法
- val.count('keywords')可以統(tǒng)計val中keywords出現(xiàn)的次數(shù)蒲赂。
-
".".join([x,y,z]),可以用用.將xyz連接
33.DataFrame的索引操作
- df.unstack()可以將層次化索引重新安排到DataFrame中(類似透視表)刁憋,stack()是其逆操作滥嘴。
- 針對Series進行unstack操作是將兩個索引列轉(zhuǎn)換成二維表的形式(透視表),Series沒有stack操作
- 針對單一索引的DataFrame:進行unstack操作是將DataFrame的index和columns轉(zhuǎn)化為索引至耻,優(yōu)先使用columns作為第一索引若皱。而stack操作則是優(yōu)先使用index作為第一索引。
- 針對多重索引的DataFrame:進行unstack操作會將index只保留第一索引尘颓,其余層級索引均轉(zhuǎn)化為columns走触。而stack操作則會將所有columns轉(zhuǎn)化為index。
>>> frame = pd.DataFrame({'a': range(7), 'b': range(7, 0, -1),
... 'c': ['one', 'one', 'one', 'two', 'two','two', 'two'],
... 'd': [0, 1, 2, 0, 1, 2, 3]})
>>> frame
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
>>> frame.unstack()
a 0 0
1 1
2 2
3 3
4 4
5 5
6 6
b 0 7
1 6
2 5
3 4
4 3
5 2
6 1
c 0 one
1 one
2 one
3 two
4 two
5 two
6 two
d 0 0
1 1
2 2
3 0
4 1
5 2
6 3
dtype: object
>>> frame.stack()
0 a 0
b 7
c one
d 0
1 a 1
b 6
c one
d 1
2 a 2
b 5
c one
d 2
3 a 3
b 4
c two
d 0
4 a 4
b 3
c two
d 1
5 a 5
b 2
c two
d 2
6 a 6
b 1
c two
d 3
dtype: object
34.索引級別調(diào)整:df.swaplevel()
In [15]: data = pd.DataFrame(np.random.randn(18).reshape((2,9)),
...: columns=[['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
...: [1, 2, 3, 1, 3, 1, 2, 2, 3]],index=[['s1','s2'],['x1','x2']]).T
In [16]: data
Out[16]:
s1 s2
x1 x2
a 1 -0.489175 1.989853
2 -0.803715 0.516374
3 0.275984 0.204901
b 1 0.443108 -2.054270
3 0.773189 0.396446
c 1 -0.298805 0.809908
2 0.143118 -0.703121
d 2 -1.865267 -0.570579
3 0.297032 -0.144984
In [17]: data.index.names=['key1','key2']
...: data.columns.names=['col1','col2']
In [18]: data
Out[18]:
col1 s1 s2
col2 x1 x2
key1 key2
a 1 -0.489175 1.989853
2 -0.803715 0.516374
3 0.275984 0.204901
b 1 0.443108 -2.054270
3 0.773189 0.396446
c 1 -0.298805 0.809908
2 0.143118 -0.703121
d 2 -1.865267 -0.570579
3 0.297032 -0.144984
In [19]: data.swaplevel('key1','key2')
Out[19]:
col1 s1 s2
col2 x1 x2
key2 key1
1 a -0.489175 1.989853
2 a -0.803715 0.516374
3 a 0.275984 0.204901
1 b 0.443108 -2.054270
3 b 0.773189 0.396446
1 c -0.298805 0.809908
2 c 0.143118 -0.703121
d -1.865267 -0.570579
3 d 0.297032 -0.144984
35.根據(jù)級別匯總
In [20]: data
Out[20]:
col1 s1 s2
col2 x1 x2
key1 key2
a 1 -0.489175 1.989853
2 -0.803715 0.516374
3 0.275984 0.204901
b 1 0.443108 -2.054270
3 0.773189 0.396446
c 1 -0.298805 0.809908
2 0.143118 -0.703121
d 2 -1.865267 -0.570579
3 0.297032 -0.144984
In [21]: data.sum(level='key2')
Out[21]:
col1 s1 s2
col2 x1 x2
key2
1 -0.344872 0.745490
2 -2.525864 -0.757326
3 1.346206 0.456363
36.將列轉(zhuǎn)換為索引: df.set_index()
被轉(zhuǎn)化為索引的列疤苹,默認會被刪除互广,可以添加參數(shù)drop=False來保留轉(zhuǎn)化為索引的列。
In [7]: frame = pd.DataFrame({'a': range(7), 'b': range(7, 0, -1),
...: 'c': ['one', 'one', 'one', 'two', 'two','two', 'two'],
...: 'd': [0, 1, 2, 0, 1, 2, 3]})
In [8]: frame
Out[8]:
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
In [9]: frame.set_index(['c','d'])
Out[9]:
a b
c d
one 0 0 7
1 1 6
2 2 5
two 0 3 4
1 4 3
2 5 2
3 6 1
37.數(shù)據(jù)合并: pd.merge()卧土、df1.join(df2)兜辞、pd.concat()
- pd.merge():可根據(jù)一個或多個鍵將不同DataFrame中的行連接起來迎瞧。與SQL風格一致。語法:pd.merge(df1,df2,how='inner',left_on='key1',right_ont='key2',on=['key1','key2'])逸吵。
- how參數(shù):有inner/left/right/outer凶硅,分別和sql的join方式對應(yīng)。
- on參數(shù):兩個DataFrame的關(guān)聯(lián)列名扫皱,相當于sql的on足绅。
- left_on/right_on參數(shù):不和on同時使用,當兩個DataFrame的關(guān)聯(lián)列名不一致時使用韩脑。
- left_index=True或right_index=True:當連接鍵在索引中時使用氢妈。
- df1.join(df2):DataFrame還有一個便捷的join實例方法,它能更為方便地實現(xiàn)按索引合并段多。它還可用于合并多個帶有相同或相似索引的DataFrame對象首量,但要求沒有重疊的列。
-
數(shù)據(jù)合并的方法:
- SQL方式的關(guān)聯(lián):使用pd.merge()或者df1.join(df2)
- 添加列:對于單列进苍,可以使用df['columnname']=data的方式加缘。對于添加多列,數(shù)據(jù)長度觉啊、順序一致的情況下拣宏,可以使用索引連接的方式,添加參數(shù)left_index=True和right_index=True杠人。
-添加行:df1.append(df2,ignore_index=True)勋乾,數(shù)據(jù)的列名必須相同,否則append會進行數(shù)據(jù)對齊操作嗡善。還可以使用pd.concat([df1,df2])進行列追加辑莫,也需要保證列名相同;通過添加keys參數(shù)罩引,用以添加層次化索引區(qū)分來源表摆昧,如keys=['df1','df2']
In [1]: import pandas as pd
...: import numpy as np
In [2]: frame1 = pd.DataFrame({'a': range(7), 'b': range(7, 0, -1),
...: 'c': ['one', 'one', 'one', 'two', 'two','two', 'two'],
...: 'd': [0, 1, 2, 0, 1, 2, 3]})
...: frame2=pd.DataFrame([[1,2,3],[4,5,6]],columns=['one','two','three'],index=['a','d']).T
In [3]: frame1
Out[3]:
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
In [4]: frame2
Out[4]:
a d
one 1 4
two 2 5
three 3 6
In [5]: f3=pd.merge(frame1,frame2,how='outer',left_on=['c'],right_index=True,suffixes=('_left','_right'))
In [6]: f3
Out[6]:
a_left b c d_left a_right d_right
0 0.0 7.0 one 0.0 1 4
1 1.0 6.0 one 1.0 1 4
2 2.0 5.0 one 2.0 1 4
3 3.0 4.0 two 0.0 2 5
4 4.0 3.0 two 1.0 2 5
5 5.0 2.0 two 2.0 2 5
6 6.0 1.0 two 3.0 2 5
6 NaN NaN three NaN 3 6
#添加行(數(shù)據(jù)追加)
In [9]: df1 = pd.DataFrame({'a': range(7), 'b': range(7, 0 , -1),
...: 'c': ['one', 'one', 'one',
...: 'two', 'two','two', 'two'],
...: 'd': [0, 1, 2, 0, 1, 2, 3]
...: })
...: df2 = pd.DataFrame([10,20,'xx1',30],index=list('abcd')).T
In [10]: df1
Out[10]:
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
In [11]: df2
Out[11]:
a b c d
0 10 20 xx1 30
#使用append進行數(shù)據(jù)追加(添加行)
In [12]: df1.append(df2)
Out[12]:
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
0 10 20 xx1 30
#通常情況下index并沒有太大用處,使用ignore_index=True重新建立索引蜒程,方便后期數(shù)據(jù)處理绅你。
In [13]: df1.append(df2,ignore_index=True)
Out[13]:
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
7 10 20 xx1 30
#也可以使用concat添加列,并添加keys來區(qū)分來源表昭躺。
In [28]: pd.concat([df1,df2],keys=['df1','df2'])
Out[28]:
a b c d
df1 0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
df2 0 10 20 xx1 30
38.數(shù)據(jù)長寬格式的轉(zhuǎn)換(透視表)
- 寬格式轉(zhuǎn)長格式(堆疊):df.unstack()或者pd.melt(df,[keyslist])忌锯,可以通過指定id_vars,value_vars選擇堆疊的列和數(shù)據(jù)领炫。
- 長格式轉(zhuǎn)寬格式:df.pivot()
#寬格式轉(zhuǎn)長格式
In [73]: data=pd.DataFrame([range(10,18),[15,24,33,13,53,21,31,91],
...: [1,2,3,4,1,2,2,2]],index=['val1','val2','val3 '],columns=list('abcdefgh')).T
...: data2=data.unstack().reset_index()
...: data2.columns=['item','name','value']
In [74]: data
Out[74]:
val1 val2 val3
a 10 15 1
b 11 24 2
c 12 33 3
d 13 13 4
e 14 53 1
f 15 21 2
g 16 31 2
h 17 91 2
In [75]: data2
Out[75]:
item name value
0 val1 a 10
1 val1 b 11
2 val1 c 12
3 val1 d 13
4 val1 e 14
5 val1 f 15
6 val1 g 16
7 val1 h 17
8 val2 a 15
9 val2 b 24
10 val2 c 33
11 val2 d 13
12 val2 e 53
13 val2 f 21
14 val2 g 31
15 val2 h 91
16 val3 a 1
17 val3 b 2
18 val3 c 3
19 val3 d 4
20 val3 e 1
21 val3 f 2
22 val3 g 2
23 val3 h 2
In [83]: pd.melt(data)
Out[83]:
variable value
0 val1 10
1 val1 11
2 val1 12
3 val1 13
4 val1 14
5 val1 15
6 val1 16
7 val1 17
8 val2 15
9 val2 24
10 val2 33
11 val2 13
12 val2 53
13 val2 21
14 val2 31
15 val2 91
16 val3 1
17 val3 2
18 val3 3
19 val3 4
20 val3 1
21 val3 2
22 val3 2
23 val3 2
In [87]: data2.pivot('item','name')
Out[87]:
value
name a b c d e f g h
item
val1 10 11 12 13 14 15 16 17
val2 15 24 33 13 53 21 31 91
val3 1 2 3 4 1 2 2 2
以上內(nèi)容根據(jù)《利用Python進行數(shù)據(jù)分析·第2版》進行整理偶垮。
參考鏈接:http://www.reibang.com/p/161364dd0acf