笨辦法學分析[05]pandas常用操作(二)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子似舵,更是在濱河造成了極大的恐慌脚猾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砚哗,死亡現(xiàn)場離奇詭異龙助,居然都是意外死亡,警方通過查閱死者的電腦和手機蛛芥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門提鸟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仅淑,你說我怎么就攤上這事称勋。” “怎么了涯竟?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵赡鲜,是天一觀的道長。 經(jīng)常有香客問我庐船,道長银酬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任醉鳖,我火速辦了婚禮捡硅,結(jié)果婚禮上哮内,老公的妹妹穿的比我還像新娘盗棵。我一直安慰自己,他們只是感情好北发,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布纹因。 她就那樣靜靜地躺著,像睡著了一般琳拨。 火紅的嫁衣襯著肌膚如雪瞭恰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天狱庇,我揣著相機與錄音惊畏,去河邊找鬼。 笑死密任,一個胖子當著我的面吹牛颜启,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浪讳,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼缰盏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起口猜,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤负溪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后济炎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體川抡,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年冻辩,在試婚紗的時候發(fā)現(xiàn)自己被綠了猖腕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡恨闪,死狀恐怖倘感,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咙咽,我是刑警寧澤老玛,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站钧敞,受9級特大地震影響蜡豹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溉苛,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一镜廉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愚战,春花似錦娇唯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拓哟,卻和暖如春想许,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背断序。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工流纹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人违诗。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓漱凝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親较雕。 傳聞我的和親對象是個殘疾皇子碉哑,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容