Я прошу прощения за стену кода, который следует, и за плохое форматирование.Я пробовал столько способов, сколько мог придумать, чтобы найти то, что заставляло эти фреймы данных возвращать значение False, когда я применял либо DataFrame.equals (), либо позже df1 == df2.Я не могу найти никаких расхождений между ними.
Я получил второй фрейм данных (dftest), применив groupby к первому (bdf) во всех столбцах, кроме ORDER_QTY.Так как количество строк одинаково для обоих этих фреймов данных, я предположил, что ничего не изменилось (что меня не удивило). Однако, чтобы быть уверенным, я сравнил их, используя bdf.equals (dftest), и он вернул false.Это было после того, как я убедился, что столбцы были в правильном порядке.Единственное, что я заметил, это то, что рамки данных имеют разный размер.В противном случае я потерялся ...
In:
dftest = bdf.groupby(['SITE', 'CUST', 'ORDER_NUMBER', 'ORDER_DATE', 'PURCHASE_ORDER', 'CHANNEL', 'SHIP_TO', 'PROD_LINE', 'GROUP_NUMBER', 'DESCRIPTION', 'ITEM', 'FW_END_DT', 'BPS_INCLUDE']).sum().reset_index()
dftest = dftest[['SITE', 'CUST', 'ORDER_NUMBER', 'ORDER_DATE', 'PURCHASE_ORDER', 'CHANNEL', 'SHIP_TO', 'PROD_LINE', 'GROUP_NUMBER', 'DESCRIPTION', 'ITEM', 'ORDER_QTY', 'FW_END_DT', 'BPS_INCLUDE']]
print(bdf.equals(dftest))
print(bdf.columns)
print(dftest.columns)
Out:
False
Index(['SITE', 'CUST', 'ORDER_NUMBER', 'ORDER_DATE', 'PURCHASE_ORDER',
'CHANNEL', 'SHIP_TO', 'PROD_LINE', 'GROUP_NUMBER', 'DESCRIPTION',
'ITEM', 'ORDER_QTY', 'FW_END_DT', 'BPS_INCLUDE'],
dtype='object')
Index(['SITE', 'CUST', 'ORDER_NUMBER', 'ORDER_DATE', 'PURCHASE_ORDER',
'CHANNEL', 'SHIP_TO', 'PROD_LINE', 'GROUP_NUMBER', 'DESCRIPTION',
'ITEM', 'ORDER_QTY', 'FW_END_DT', 'BPS_INCLUDE'],
dtype='object')
^ Столбцы кажутся одинаковыми, но bdf.equals(dftest)
выдает False
In:
bdf.info()
dftest.info()
Out:
<class 'pandas.core.frame.DataFrame'>
Index: 53025 entries, 0 to 53024
Data columns (total 14 columns):
SITE 53025 non-null object
CUST 53025 non-null object
ORDER_NUMBER 53025 non-null object
ORDER_DATE 53025 non-null datetime64[ns]
PURCHASE_ORDER 53025 non-null object
CHANNEL 53025 non-null object
SHIP_TO 53025 non-null object
PROD_LINE 53025 non-null object
GROUP_NUMBER 53025 non-null object
DESCRIPTION 53025 non-null object
ITEM 53025 non-null object
ORDER_QTY 53025 non-null int64
FW_END_DT 53025 non-null datetime64[ns]
BPS_INCLUDE 53025 non-null int64
dtypes: datetime64[ns](2), int64(2), object(10)
memory usage: 6.1+ MB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53025 entries, 0 to 53024
Data columns (total 14 columns):
SITE 53025 non-null object
CUST 53025 non-null object
ORDER_NUMBER 53025 non-null object
ORDER_DATE 53025 non-null datetime64[ns]
PURCHASE_ORDER 53025 non-null object
CHANNEL 53025 non-null object
SHIP_TO 53025 non-null object
PROD_LINE 53025 non-null object
GROUP_NUMBER 53025 non-null object
DESCRIPTION 53025 non-null object
ITEM 53025 non-null object
ORDER_QTY 53025 non-null int64
FW_END_DT 53025 non-null datetime64[ns]
BPS_INCLUDE 53025 non-null int64
dtypes: datetime64[ns](2), int64(2), object(10)
memory usage: 5.7+ MB
^ Все выглядит одинаково, кроме размера, так какЯ упомянул.
In:
common = bdf.merge(dftest,on=['SITE', 'CUST', 'ORDER_NUMBER', 'ORDER_DATE', 'PURCHASE_ORDER', 'CHANNEL', 'SHIP_TO', 'PROD_LINE', 'GROUP_NUMBER', 'DESCRIPTION', 'ITEM', 'ORDER_QTY', 'FW_END_DT', 'BPS_INCLUDE'], how='outer', indicator=True)
print(common[common['_merge'] != 'both'])
Out:
Empty DataFrame
Columns: [SITE, CUST, ORDER_NUMBER, ORDER_DATE, PURCHASE_ORDER, CHANNEL, SHIP_TO, PROD_LINE, GROUP_NUMBER, DESCRIPTION, ITEM, ORDER_QTY, FW_END_DT, BPS_INCLUDE, _merge]
Index: []
Попытка слияния и выбора строк не в обоих df
In:
bdf[(~bdf.SITE.isin(common.SITE))&(~bdf.CUST.isin(common.CUST))&(~bdf.ORDER_NUMBER.isin(common.ORDER_NUMBER))&(~bdf.ORDER_DATE.isin(common.ORDER_DATE))&(~bdf.PURCHASE_ORDER.isin(common.PURCHASE_ORDER))&(~bdf.CHANNEL.isin(common.CHANNEL))&(~bdf.SHIP_TO.isin(common.SHIP_TO))&(~bdf.PROD_LINE.isin(common.PROD_LINE))&(~bdf.GROUP_NUMBER.isin(common.GROUP_NUMBER))&(~bdf.DESCRIPTION.isin(common.DESCRIPTION))&(~bdf.ITEM.isin(common.ITEM))&(~bdf.ORDER_QTY.isin(common.ORDER_QTY))&(~bdf.FW_END_DT.isin(common.FW_END_DT))&(~bdf.BPS_INCLUDE.isin(common.BPS_INCLUDE))]
Out:
SITE CUST ORDER_NUMBER ORDER_DATE PURCHASE_ORDER CHANNEL SHIP_TO PROD_LINE GROUP_NUMBER DESCRIPTION ITEM ORDER_QTY FW_END_DT BPS_INCLUDE
Ничего не делает
In:
(bdf == dftest).all().all()
Out:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-34-6c2f52f55e60> in <module>()
----> 1 (bdf == dftest).all().all()
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops.py in f(self, other)
1611 # Another DataFrame
1612 if not self._indexed_same(other):
-> 1613 raise ValueError('Can only compare identically-labeled '
1614 'DataFrame objects')
1615 return self._compare_frame(other, func, str_rep)
ValueError: Can only compare identically-labeled DataFrame objects
Они не помечены одинаково?
Когда я попытался найти следующее, мне предложили попробовать:
In:
bdf.eq(dftest)
Out:
SITE CUST ORDER_NUMBER ORDER_DATE PURCHASE_ORDER CHANNEL SHIP_TO PROD_LINE GROUP_NUMBER DESCRIPTION ITEM ORDER_QTY FW_END_DT BPS_INCLUDE
0 False False False False False False False False False False False False False False
1 False False False False False False False False False False False False False False
2 False False False False False False False False False False False False False False
3 False False False False False False False False False False False False False False
4 False False False False False False False False False False False False False False
5 False False False False False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
52995 False False False False False False False False False False False False False False
106050 rows × 14 columns
И в этом случае похоже, что каждая пара ячеек не совпадает ...: (
Я что-то упускаю совершенно очевидное?