Python 图纸数据框变为与构造的相同数据框不相等
我需要这方面的帮助,因为我已经搜索了近3个小时的解决方案,但没有找到任何东西 我这里有一个简单的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
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我也在我的回答中添加了您的解决方案:)我觉得这很好,我不认为这会导致性能问题。按字符串进行铸造不是一个昂贵的过程。我想保留床单和信誉,这样,如果有人遇到这个问题,他们可以尝试一下,这可能会帮助他们解决问题:)