我在博客上分享的都是在實際項目中遇到的棘手的並且解決的問題,整理出來當作知識總結,希望也能幫助到需要的人。
一、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=None
、index=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)