python文件可以包括任何数据内容_python 文件数据合并(数据行不对应)?
這里我們討論如何利用concat方法進行簡單的數據拼接。
import pandas as pd
ser1 = pd.Series(['A','B','C'], index=[1,2,3])
ser2 = pd.Series(['D','E','F'], index=[4,5,6])
ser = pd.concat([ser1,ser2])
print(ser1)
print(ser2)
print(ser)
1 A
2 B
3 C
dtype: object
4 D
5 E
6 F
dtype: object
1 A
2 B
3 C
4 D
5 E
6 F
dtype: object
在這個例子中,我們簡單的對Series進行了拼接,我們看到默認的情況是逐行進行合并操作,對DataFrame對象進行簡單拼接也是一樣。
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'3':'A3','4':'A4'},'B':{'3':'B3','4':'B4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2]))
A B
1 A1 B1
2 A2 B2
A B
3 A3 B3
4 A4 B4
A B
1 A1 B1
2 A2 B2
3 A3 B3
4 A4 B4
通過這種方法,我們也是以逐行的方式對兩個DataFrame進行了合并。
很自然的,相對于逐行進行合并,也可以按逐列的方式進行合并,類比之前講過的,加上一個axis參數即可:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'C':{'1':'C1','2':'C4'},'D':{'1':'D1','2':'D2'}})
print(df1)
print(df2)
print(pd.concat([df1,df2], axis=1))
A B
1 A1 B1
2 A2 B2
C D
1 C1 D1
2 C4 D2
A B C D
1 A1 B1 C1 D1
2 A2 B2 C4 D2
上面的例子舉得比較特殊,刻意設置了兩個DataFrame數據的索引是不同的,如果恰好他們的索引相同,會不會出問題。
這個問題提的不錯,Pandas中concat方法的一個很大的特點就是保留索引,合并后的結果里各行的索引與合并前的索引保持一致。
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})
print(pd.concat([df1,df2]))
A B
1 A1 B1
2 A2 B2
1 A3 B3
2 A4 B4
可以看到,結果并沒有報錯,而且確實是保留了合并前的索引。但是這并不是我們想看到的,因為這樣一來,A1、A3兩項的索引就是完全一樣了。
那就眼睜睜的看著這種情況發生嗎?
當然不是,解決的方法有兩種:
第一種就是忽略這種索引,如果索引是這種沒有實際意義的流水ID,那么我們可以讓他們順次的往下排列,從而避免重復,設置一個ignore_index即可實現。
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2], ignore_index=True))
A B
1 A1 B1
2 A2 B2
A B
1 A3 B3
2 A4 B4
A B
0 A1 B1
1 A2 B2
2 A3 B3
3 A4 B4
那如果我覺得原來的索引代表了實際意義,不能忽略呢?
別急,第二種方法就是利用多級索引的方式來保留原索引。
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2], keys=['x','y']))
A B
1 A1 B1
2 A2 B2
A B
1 A3 B3
2 A4 B4
A B
x 1 A1 B1
2 A2 B2
y 1 A3 B3
2 A4 B4
還漏了一種情況,就是如果列名不完全一致應該如何處理?
我們繼續看看在合并的過程中,列會出現什么現象。
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'},'C':{'1':'C1','2':'C2'}})
df2 = pd.DataFrame({'B':{'3':'B3','4':'B4'},'C':{'3':'C3','4':'C4'},'D':{'3':'D3','4':'D4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2]))
A B C
1 A1 B1 C1
2 A2 B2 C2
B C D
3 B3 C3 D3
4 B4 C4 D4
A B C D
1 A1 B1 C1 NaN
2 A2 B2 C2 NaN
3 NaN B3 C3 D3
4 NaN B4 C4 D4
從結果中我們可以看出,我們這種默認的合并方式是對所有的輸入列取并集,如果在某個位置上值缺失,則用NaN值來代替。
如果我們想換一種方式,對輸入列取交集,這樣就不會出現NaN值了。
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'},'C':{'1':'C1','2':'C2'}})
df2 = pd.DataFrame({'B':{'3':'B3','4':'B4'},'C':{'3':'C3','4':'C4'},'D':{'3':'D3','4':'D4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2], join='inner'))
A B C
1 A1 B1 C1
2 A2 B2 C2
B C D
3 B3 C3 D3
4 B4 C4 D4
B C
1 B1 C1
2 B2 C2
3 B3 C3
4 B4 C4
當然,我們還可以指定任何一個合并項的列來作為最后結果的使用列:
import pandas as pd
df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'},'C':{'1':'C1','2':'C2'}})
df2 = pd.DataFrame({'B':{'3':'B3','4':'B4'},'C':{'3':'C3','4':'C4'},'D':{'3':'D3','4':'D4'}})
print(df1)
print(df2)
print(pd.concat([df1, df2], join_axes=[df1.columns]))
A B C
1 A1 B1 C1
2 A2 B2 C2
B C D
3 B3 C3 D3
4 B4 C4 D4
A B C
1 A1 B1 C1
2 A2 B2 C2
3 NaN B3 C3
4 NaN B4 C4
關于數據科學更系統、更深入的探討可進入我們的專欄《Python數據科學之路》:醬油哥:來吧,一起踏上Python數據科學之路?zhuanlan.zhihu.com
本專欄模仿美劇劇集編排分為五季,第一季:Python編程語言核心基礎、第二季:Python數據分析基本工具、第三季:Python語言描述的數學基礎、第四季:機器學習典型算法專題、第五季:實戰熱點深度應用。
總結
以上是生活随笔為你收集整理的python文件可以包括任何数据内容_python 文件数据合并(数据行不对应)?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征信逾期记录怎么申请人工消除,满足以下四
- 下一篇: python第三方包是什么意思_安装Py