Python 当我将数据框写入excel时,表()会在数据框中放入不需要的列。为什么?
我正在从一张包含几十列的excel表格中创建一个透视表。我从excel工作表中得到第三列,尽管它不在我的代码中 数据如下所示 源IP、目标IP、区域、连接、p/D、评论、位置、时间、备份、数据源 1.1.1.1,2.2.2,数据中心,3,P,装饰,FL,5X5,镜像,云Python 当我将数据框写入excel时,表()会在数据框中放入不需要的列。为什么?,python,python-3.x,pandas,pivot-table,Python,Python 3.x,Pandas,Pivot Table,我正在从一张包含几十列的excel表格中创建一个透视表。我从excel工作表中得到第三列,尽管它不在我的代码中 数据如下所示 源IP、目标IP、区域、连接、p/D、评论、位置、时间、备份、数据源 1.1.1.1,2.2.2,数据中心,3,P,装饰,FL,5X5,镜像,云 3.3.3.3,2.2.2.2,办公室,45,D,活动,ME,24X7,RAID,本地 1.1.1.1,4.4.4.4,办公室,33,P,活动,CA,1X3,RAID,云 在Excel中手动创建数据透视表。试图用各种各样的理由来
3.3.3.3,2.2.2.2,办公室,45,D,活动,ME,24X7,RAID,本地 1.1.1.1,4.4.4.4,办公室,33,P,活动,CA,1X3,RAID,云
在Excel中手动创建数据透视表。试图用各种各样的理由来摆脱它 fw_files = filedialog.askopenfilename() #here we grab a filename to parse
df = pd.read_excel(fw_files)
df2 = df.drop_duplicates(['Source IP', 'Destination IP'])# lose the duplicates
df3 = df2[df2['''P/D'''].str.contains('P', na=False)] #only flagged P and don't puke on NAN
df4 = pd.pivot_table(df3, index=['Source IP', 'Destination IP'])# pivot on my two values
writer = pd.ExcelWriter(fw_files + '-PIVOT.xlsx', engine='openpyxl')
df3.to_excel(writer, sheet_name = 'RAW_DATA')
df4.to_excel(writer, sheet_name = 'SOURCE_TO_DESTINATION')
writer.save()
预期结果
源IP目标IP
10.120.160.71 172.1.12.5
172.1.1.5
实际结果。我不知道为什么会出现“连接”列,但从excel工作表来看它是正确的
源IP目标IP连接
10.120.160.71 172.1.12.83
172.34.4.545如果您可以添加更多的源数据,使我们获得可能有用的预期结果。我猜你得到的是因为你没有把“连接”列排除在外。默认情况下,Read Excel将提取所有列,如果该列位于数据框中,pivot_表很可能默认为为为您聚合它,因为它是数字 您可以尝试将dataframe定义为只需要的列。这至少应该为你指明正确的方向
df3 = df2.loc[df2['''P/D'''].str.contains('P', na=False), df2.columns.intersection(['Source IP', 'Destination IP'])]
编辑其他输出想法
我不太清楚为什么只使用索引进行数据透视,因为通常情况下,数据透视将用于聚合。我认为您应该能够分组,因为您似乎不需要聚合。如果您希望输出看起来像那样,您可以设置索引和导出。输出看起来有点愚蠢,但它会以您上面指定的格式在源值之间留下间隙
df:
Source Destination
0 10.120.160.71 172.1.12.5
1 10.120.160.71 172.1.1.5
2 10.120.160.72 172.1.12.6
3 10.120.160.72 172.1.1.6
df = df.set_index(['Source','Destination'])
df.to_excel('df.xlsx')
Source Destination
0 10.120.160.71 172.1.12.5
1 172.1.1.5
2 10.120.160.72 172.1.12.6
3 172.1.1.6
如果您可以添加更多的源数据,使我们获得预期的结果,这可能会有所帮助。我猜你得到的是因为你没有把“连接”列排除在外。默认情况下,Read Excel将提取所有列,如果该列位于数据框中,pivot_表很可能默认为为为您聚合它,因为它是数字 您可以尝试将dataframe定义为只需要的列。这至少应该为你指明正确的方向
df3 = df2.loc[df2['''P/D'''].str.contains('P', na=False), df2.columns.intersection(['Source IP', 'Destination IP'])]
编辑其他输出想法
我不太清楚为什么只使用索引进行数据透视,因为通常情况下,数据透视将用于聚合。我认为您应该能够分组,因为您似乎不需要聚合。如果您希望输出看起来像那样,您可以设置索引和导出。输出看起来有点愚蠢,但它会以您上面指定的格式在源值之间留下间隙
df:
Source Destination
0 10.120.160.71 172.1.12.5
1 10.120.160.71 172.1.1.5
2 10.120.160.72 172.1.12.6
3 10.120.160.72 172.1.1.6
df = df.set_index(['Source','Destination'])
df.to_excel('df.xlsx')
Source Destination
0 10.120.160.71 172.1.12.5
1 172.1.1.5
2 10.120.160.72 172.1.12.6
3 172.1.1.6
这很难看,但我这样做就解决了 df4=df4.drop([“连接”],轴=1)
然后写出来(从第2行开始算起)很难看,但我这样做解决了这个问题 df4=df4.drop([“连接”],轴=1)
然后写操作开始了(从第2行开始)是的,似乎我需要一个数字列。它会找到第一个包含所有源IP值的源IP,并使用Pivot报告它。您的解抛出一个错误,明确告诉我没有要聚合的数字列。所以你让我走上了正确的道路。我已经添加了相同的数据来演示这个问题。是的,似乎我需要一个数字列。它会找到第一个包含所有源IP值的源IP,并使用Pivot报告它。您的解抛出一个错误,明确告诉我没有要聚合的数字列。所以你让我走上了正确的道路。我已经添加了相同的数据来说明这个问题。