Python 图纸数据框变为与构造的相同数据框不相等

Python 图纸数据框变为与构造的相同数据框不相等,python,pandas,dataframe,google-sheets,google-sheets-api,Python,Pandas,Dataframe,Google Sheets,Google Sheets Api,我需要这方面的帮助,因为我已经搜索了近3个小时的解决方案,但没有找到任何东西 我这里有一个简单的pandasdataframe,它是由脚本创建的,这个dataframe通过使用 源代码: import gspread, pandas as pd cols = [ "Filename", "Version Number", "House Name", ] df = pd.DataFrame(columns=cols) for i i

我需要这方面的帮助,因为我已经搜索了近3个小时的解决方案,但没有找到任何东西

我这里有一个简单的
pandas
dataframe,它是由脚本创建的,这个dataframe通过使用

源代码:

import gspread, pandas as pd

cols = [
"Filename",
"Version Number",
"House Name",
]

df = pd.DataFrame(columns=cols)

for i in range(0,5):
    out = {
    "Filename":i,
    "Version Number":i+1,
    "House Name":i+2
    }
    df = df.append(out,ignore_index=True)





creds_path = "creds.json"
service_account = gspread.service_account(filename=creds_path)
spreadsheet = service_account.open_by_key("1a8NxVF6yUE0jSa63tjhEDHAS2q7dsdo0lT4saMGKROI")
worksheet = spreadsheet.sheet1


df2 = pd.DataFrame(worksheet.get_all_records())
print(df.equals(df2))

#worksheet.clear()
#worksheet.update([df.columns.values.tolist()] + df.values.tolist())
   Filename  Version Number  House Name
0         0               1           2
1         1               2           3
2         2               3           4
3         3               4           5
4         4               5           6
这是一个非常简单的脚本,它创建了一个
pandas
dataframe,然后以编程方式将其上传到googlesheet。我制作此表是为了测试目的,我可以公开将其提供给任何人,如果您想试用,您将需要包含凭据的
.json
文件,如果您想试用,我也为任何人制作了此表,但请注意,此仅用于测试目的

注意:问题解决后,我将停用凭据 回答

链接:

现在我有个问题。创建
pandas
数据帧后,将其与此部分代码一起上载<代码>工作表.clear()和
工作表.update([df.columns.values.tolist()]+df.values.tolist())
。您可以在工作表上清楚地看到它的工作原理,工作表如下所示

现在,当我尝试阅读工作表并将其转换为
pandas
dataframe时,使用此选项

df2 = pd.DataFrame(worksheet.get_all_records())
我只是想看看工作表上的数据是否与脚本上创建的数据框完全相同。现在,当我运行这个
print(df.equals(df2))
时,它返回
False
,这意味着
df
df2
的数据帧不同,我可以清楚地看到不是我所期望的。原因很明显,我上传了相同的数据帧,但为什么在比较这两个数据帧时,它会说
False
?事实上,它应该是
真的
对吗

如果您尝试打印出
df
&
df2
,您可以清楚地看到它们是相同的,对吗?我建议你试着自己把剧本打印出来

df

  Filename Version Number House Name
0        0              1          2
1        1              2          3
2        2              3          4
3        3              4          5
4        4              5          6
df2

import gspread, pandas as pd

cols = [
"Filename",
"Version Number",
"House Name",
]

df = pd.DataFrame(columns=cols)

for i in range(0,5):
    out = {
    "Filename":i,
    "Version Number":i+1,
    "House Name":i+2
    }
    df = df.append(out,ignore_index=True)





creds_path = "creds.json"
service_account = gspread.service_account(filename=creds_path)
spreadsheet = service_account.open_by_key("1a8NxVF6yUE0jSa63tjhEDHAS2q7dsdo0lT4saMGKROI")
worksheet = spreadsheet.sheet1


df2 = pd.DataFrame(worksheet.get_all_records())
print(df.equals(df2))

#worksheet.clear()
#worksheet.update([df.columns.values.tolist()] + df.values.tolist())
   Filename  Version Number  House Name
0         0               1           2
1         1               2           3
2         2               3           4
3         3               4           5
4         4               5           6
主要目标:

import gspread, pandas as pd

cols = [
"Filename",
"Version Number",
"House Name",
]

df = pd.DataFrame(columns=cols)

for i in range(0,5):
    out = {
    "Filename":i,
    "Version Number":i+1,
    "House Name":i+2
    }
    df = df.append(out,ignore_index=True)





creds_path = "creds.json"
service_account = gspread.service_account(filename=creds_path)
spreadsheet = service_account.open_by_key("1a8NxVF6yUE0jSa63tjhEDHAS2q7dsdo0lT4saMGKROI")
worksheet = spreadsheet.sheet1


df2 = pd.DataFrame(worksheet.get_all_records())
print(df.equals(df2))

#worksheet.clear()
#worksheet.update([df.columns.values.tolist()] + df.values.tolist())
   Filename  Version Number  House Name
0         0               1           2
1         1               2           3
2         2               3           4
3         3               4           5
4         4               5           6
我的目标是查看表中的数据是否正确 与脚本中创建的数据帧完全相同。我只是想看看他们是否和我做的一样 取决于该条件的其他物品


有没有人能教育我,让我知道我在这里缺少了什么。非常感谢你的帮助

gspread API返回类型为
int64
的数据帧
df2
,而您手动创建的数据帧
df
的类型为
int
。由于类型不同,两个数据帧不相等

如果尝试
df.astype('int64').equals(df2)
它将返回
True

或者,您可以使用
all(df.eq(df2))
,它也将返回
True
。这将比较数据帧的每个元素,并使用
all
组合布尔标志


第三种方法(OP在下面的评论中建议)是执行
df.astype(“str”).equals(df2.astype(“str”))

Wow!谢谢不幸的是。。。我的每一列的值都可以是类似于
int
float
strings
的任何值。。。我想我忘了。因此对于这种情况,
df.astype('int64').equals(df2)
非常好,对于列值类似于单词的示例来说,它不是一个解决方案,对吗?所以想知道
all(df.eq(df2))
是否也能涵盖这一点?只要你比较相同的数据类型,df.eq(df2)应该可以工作,但是如果你比较,比如说,
'1'
1
,它就不会工作了!我尝试了另一个示例数据框架,但不幸的是,提供的解决方案不起作用,但我根据您的答案想到了一些启发我的东西。我试着做了一个
df.astype(“str”).equals(df2.astype(“str”))
,效果很好。。我能问一下我想到的这个解决方案是否可以?还是在时间复杂性方面不好?谢谢我想这解决了我的问题。如果你能把它作为另一个解决方案添加到你的答案中,可以吗。如果没有您的回答,我不会想到这一点。现在我想,在比较两个数据帧时,数据帧中这些数据的类型是非常重要的。@Iceear我也在我的回答中添加了您的解决方案:)我觉得这很好,我不认为这会导致性能问题。按字符串进行铸造不是一个昂贵的过程。我想保留床单和信誉,这样,如果有人遇到这个问题,他们可以尝试一下,这可能会帮助他们解决问题:)