[英]Compare each row in one dataframe to each row in another dataframe in Python
[英]How to compare each value of row in a dataframe with each value in the row before with python?
我有一個 dataframe,它看起來像這樣(列數和行數可以不同):
0 1 2
2015-01-02 ISIN1 ISIN2 ISIN3
2015-05-04 ISIN4 ISIN2 ISIN5
2015-09-01 ISIN4 ISIN5 ISIN6
2016-01-04 ISIN7 ISIN8 ISIN2
2016-05-02 ISIN9 ISIN7 ISIN10
2016-09-01 ISIN11 ISIN12 ISIN13
2017-01-02 ISIN11 ISIN12 ISIN14
2017-05-02 ISIN12 ISIN11 ISIN15
2017-09-01 ISIN12 ISIN16 ISIN17
2018-01-02 ISIN16 ISIN11 ISIN18
2018-05-02 ISIN4 ISIN8 ISIN7
2018-09-03 ISIN12 ISIN7 ISIN19
2019-01-02 ISIN20 ISIN21 ISIN22
2019-05-02 ISIN13 ISIN7 ISIN8
2019-09-02 ISIN23 ISIN24 ISIN15
2020-01-02 ISIN25 ISIN23 ISIN24
2020-05-04 ISIN24 ISIN26 ISIN4
我現在的任務是將每行的每個值與之前行的每個值進行比較。 我想知道該值是否在之前的行中。 我想得到兩個數據框作為結果。
保留前一行中沒有的值:
0 1 2 2015-01-02 ISIN1 ISIN2 ISIN3 2015-05-04 ISIN4 ISIN5 2015-09-01 ISIN6 2016-01-04 ISIN7 ISIN8 ISIN2 2016-05-02 ISIN9 ISIN10 2016-09-01 ISIN11 ISIN12 ISIN13 2017-01-02 ISIN14 2017-05-02 ISIN15 2017-09-01 ISIN16 ISIN17 2018-01-02 ISIN11 ISIN18 2018-05-02 ISIN4 ISIN8 ISIN7 2018-09-03 ISIN12 ISIN19 2019-01-02 ISIN20 ISIN21 ISIN22 2019-05-02 ISIN13 ISIN7 ISIN8 2019-09-02 ISIN23 ISIN24 ISIN15 2020-01-02 ISIN25 2020-05-04 ISIN26 ISIN4
保留前一行中的值:
0 1 2 2015-01-02 2015-05-04 ISIN2 2015-09-01 ISIN4 ISIN5 2016-01-04 2016-05-02 ISIN7 2016-09-01 2017-01-02 ISIN11 ISIN12 2017-05-02 ISIN12 ISIN11 2017-09-01 ISIN12 2018-01-02 ISIN16 2018-05-02 2018-09-03 ISIN7 2019-01-02 2019-05-02 2019-09-02 2020-01-02 ISIN23 ISIN24 2020-05-04 ISIN24
到目前為止我探索的內容:
for i in range(len(df)):
print(np.isin(df.values[i, :], df.shift().values[i, :]))
創建這個:
[False False False]
[False True False]
[ True True False]
[False False False]
[False True False]
[False False False]
[ True True False]
[ True True False]
[ True False False]
[ True False False]
[False False False]
[False True False]
[False False False]
[False False False]
[False False False]
[False True True]
[ True False False]
通過將此值附加到列表中,我將能夠創建一個新的 dataframe。 但我認為必須有更好的方法。
有沒有人知道如何在不遍歷 dataframe 的情況下做到這一點?
非常感謝!
最好的問候,內皮
這是一種用 NaN 替換重復值的方法:
df = pd.DataFrame(dict(a=[1,1,2,2,4], b=[0,5,6,6,8]), index=np.arange(5)+100)
mask = np.full_like(df, False, dtype=bool)
mask[1:] = df.iloc[1:].reset_index(drop=True) == df.iloc[:-1].reset_index(drop=True)
df[mask] = None
需要reset_index
操作,否則 pandas 將嘗試對匹配的行索引進行==
比較。
原裝DataFrame:
a b
100 1 0
101 1 5
102 2 6
103 2 6
104 4 8
后:
a b
100 1.0 0.0
101 NaN 5.0
102 2.0 6.0
103 NaN NaN
104 4.0 8.0
相反,你需要做
mask = np.logical_not(mask)
嘿,也許您正在尋找類似的東西:
data = {'first': ['ok', 'none', 'ok', 'ok', 'ok', 'ok', 'ok', 'ok', 'none', 'ok'],
'second': [1, 3, 4, 7, 8, 2, 4, 9, 6, 9]}
df = pd.DataFrame(data, columns = ['first', 'second'])
df_results = df.eq(df.shift())
df_results.where(df_results != False, df)
希望有幫助
我挖得更深了。 我現在的解決方案是:
import pandas as pd
import numpy as np
row_0 = np.array(['ISIN1', 'ISIN4', 'ISIN4', 'ISIN7', 'ISIN9', 'ISIN11', 'ISIN11', 'ISIN12', 'ISIN12', 'ISIN16', 'ISIN4', 'ISIN12', 'ISIN20', 'ISIN13', 'ISIN23', 'ISIN25', 'ISIN24'])
row_1 = np.array(['ISIN2', 'ISIN2', 'ISIN5', 'ISIN8', 'ISIN7', 'ISIN12', 'ISIN12', 'ISIN11', 'ISIN16', 'ISIN11', 'ISIN8', 'ISIN7', 'ISIN21', 'ISIN7', 'ISIN24', 'ISIN23', 'ISIN26'])
row_2 = np.array(['ISIN3', 'ISIN5', 'ISIN6', 'ISIN2', 'ISIN10', 'ISIN13', 'ISIN14', 'ISIN15', 'ISIN17', 'ISIN18', 'ISIN7', 'ISIN19', 'ISIN22', 'ISIN8', 'ISIN15', 'ISIN24', 'ISIN4'])
data = {0:row_0, 1:row_1, 2:row_2}
df = pd.DataFrame(data)
print(df)
df_in_row_before = df[pd.DataFrame(np.array([np.isin(df.values[i, :], df.shift().values[i, :]) for i in range(len(df))]))]
print(df_in_row_before)
df_not_in_row_before = df[pd.DataFrame(np.array([np.isin(df.values[i, :], df.shift().values[i, :], invert=True) for i in range(len(df))]))]
print(df_not_in_row_before)
這正是我所需要的。 但是,如果有人有更好的解決方案,我很樂意看看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.