python 數據分析、數據處理之超實用的pandas | 表關聯連接、新增添加一行記錄、空值判斷、數據讀寫、按行輸出等

我在博客上分享的都是在實際項目中遇到的棘手的並且解決的問題,整理出來當作知識總結,希望也能幫助到需要的人。


一、dataframe 的merge方法實現千萬條數據的關聯

這裏的temp1是特徵數據,有幾千萬條,temp2是樣本標籤,有幾萬條,現在需要拿出有標籤的幾萬條樣本的數據,做後續分析。
之前自己寫循環做關聯操作,每次循環到150萬次左右程序就killed了,內存不足,算不出來。
嘗試了好多方法,發現dataframe的merge方法簡直不能更好用,只需一行代碼就能實現,計算速度也是極快的。merge裏面傳四個參數,分別是兩張表的名稱、關聯字段的名稱、和連接方式(left或right)。

temp1 = pd.read_csv('/Users/taorui02/Documents/test_data.txt')
temp2 = pd.read_csv('/Users/taorui02/Documents/test_sample.txt')
merge_data1 = pd.merge(temp2, temp1, on='id', how='left')
merge_data1.to_csv("test.csv", index=False, sep=',')

二、dataframe新增一行數據

dataframe用來做數據處理是十分方便的,可是要增加一行數據的方法我折騰了會兒才解決,因爲它不同於修改、賦值。
我們的思維慣性是給新增一行給一個列賦值,其他列默認就是空,可是dataframe不是這樣,給一個值是放不到表中的,它也不會報錯。正確的放法是把一行數據放到list裏面再賦值。

如果是修改賦值,這樣就可以:

1.先新建一個dataframe表
import pandas as pd
import numpy as np

df2 = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['a', 'b', 'c', 'd'],
                   columns=['one', 'two', 'three', 'four'])

print(df2)

輸出:

   one  two  three  four
a    0    1      2     3
b    4    5      6     7
c    8    9     10    11
d   12   13     14    15

2.修改一列
import pandas as pd
import numpy as np

df2 = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['a', 'b', 'c', 'd'],
                   columns=['one', 'two', 'three', 'four'])
df2['one'] = 99999
print(df2)

輸出:

     one  two  three  four
a  99999    1      2     3
b  99999    5      6     7
c  99999    9     10    11
d  99999   13     14    15

3. 修改特定值
import pandas as pd
import numpy as np

df2 = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['a', 'b', 'c', 'd'],
                   columns=['one', 'two', 'three', 'four'])
df2['one'][0] = 99999
print(df2)

輸出:

     one  two  three  four
a  99999    1      2     3
b      4    5      6     7
c      8    9     10    11
d     12   13     14    15

4. 使用索引賦值的方式不能實現新增一行,新增的話要用.loc[i]=一個list這種方式。
# coding:utf-8
from pandas import *
df = DataFrame(columns=('lib', 'qty1', 'qty2'))  # 生成空的pandas表

df.loc[0] = [1, 3, 4]
print df

輸出:

  lib qty1 qty2
0   1    3    4

三、dataframe裏面的空值判斷

在數據處理的過程中,空值是再常見不過的了。
之前沒有用pandas的時候判斷空值用 if value == '':來判斷,可是到了dataframe裏面這種代碼就失效了,用if value :判斷還是報錯,最後發現pandas裏面有自帶的判斷空值的方法。
當在文本文件中,空值爲null,讀入dataframe中,空值就變成了NaN,使用pd.isnull()或者pd.notnull()對一列進行空值判斷,即if pd.notnull(value):來判斷。

四、數據讀取和保存

1. 數據讀取

普通讀取,sep指定文件的分隔符

using_data = pd.read_csv("/Users/taorui02/Documents/id", sep=' ')

很多時候我們拿到的數據是沒有表頭的,這時候讀入數據要麼不顯示錶頭,加header=None就行,要麼根據需要自己定義表頭。
自定義表頭讀取,這裏給數據加了兩個列名,id、label。

using_data = pd.read_csv("/Users/taorui02/Documents/id", sep=' ', header=None, names=['id', 'label'])
2. 數據寫入CSV

數據處理完寫入文件也是有點講究的,有時候需要表頭,有時候不需要,不需要的時候同樣加header=Noneindex=False就可以。
header=None:不顯示列名
index=False:不顯示索引號

using_data.to_csv("/Users/taorui02/Documents/IDd.csv", index=False, header=None)

五、逐行打印數據

在hadoop集羣上處理數據的時候輸出的結果後續需要拆分合並的操作,這時候不能直接保存數據到文件,而是輸出,print或者sys.stdout.write(),這時候輸出的內容是不能帶列名和索引號的,需要逐行打印數據內容。
這裏的要點是using_data.loc[index]訪問到的不是我們真正想要的,要加上.values才能拿到數據。

import pandas as pd
# 讀入數據
using_data = pd.read_csv("/Users/taorui02/Documents/id", sep=' ', header=None, names=['id', 'label'])
# 逐行打印
for index in using_data.index:
    print(using_data.loc[index].values)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章