【问题标题】:Printing values with Pandas使用 Pandas 打印值
【发布时间】:2021-07-17 22:24:42
【问题描述】:

首先,我对 Python 完全陌生,所以,也许是一些超级简单的事情,我做得不对。

我正在读取多个工作表 xlsx 文件并将它们中的每一个发送到单独的数据框。 (至少,我认为我正在这样做)。

xl = pd.ExcelFile("results/report.xlsx")
d = {} # your dict.
for sheet in xl.sheet_names:
    d[f'{sheet}']= pd.read_excel(xl,sheet_name=sheet)



lista_colunas = [7, 10, 101, 102, 103, 104]
d['Seg3_results'].columns[lista_colunas].values

这是结果。

>>> print(d)
{'Sheet': Empty DataFrame
Columns: []
Index: [], 'report': Empty DataFrame
Columns: []
Index: [], 'Seg10_results':    ID      Hora de início   Hora de conclusão      Email  ...  Humanas  Exatas  Linguagens Biológicas
0   1 2021-04-28 13:38:51 2021-04-28 16:25:59  anonymous  ...       38      50          38         38 
1   2 2021-04-28 17:02:11 2021-04-28 17:57:48  anonymous  ...       25       0          25         38 

[2 rows x 105 columns], 'Seg1_results':     ID      Hora de início   Hora de conclusão  ... Exatas Linguagens  Biológicas
0    1 2020-05-26 08:30:00 2020-05-26 09:15:00  ...     25         29          38
1    2 2020-05-26 08:31:12 2020-05-26 09:21:38  ...     38         33          38
2    3 2020-05-26 08:27:40 2020-05-26 09:21:38  ...     50         29          38

然后,我尝试仅打印每个 df 的一些列(手动尝试)

lista_colunas = [7, 10, 101, 102, 103, 104]
d['Seg10_results'].columns[lista_colunas].values

但我得到的只是这个:

>>> d['Seg10_results'].columns[lista_colunas].values
array(['NOME COMPLETO', 'QUAL A SUA OFICINA DE APRENDIZAGEM?', 'Humanas',
       'Exatas', 'Linguagens', 'Biológicas'], dtype=object)

正在显示任何值

如果我只打电话给d['Seg10_results'][lista_colunas],我会得到这个:

>>> d['Seg10_results'][lista_colunas]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Adilson\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\frame.py", line 3461, in __getitem__
    indexer = self.loc._get_listlike_indexer(key, axis=1)[1]
  File "C:\Users\Adilson\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\indexing.py", line 1314, in _get_listlike_indexer
    self._validate_read_indexer(keyarr, indexer, axis)
  File "C:\Users\Adilson\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\indexing.py", line 1374, in _validate_read_indexer
    raise KeyError(f"None of [{key}] are in the [{axis_name}]")
KeyError: "None of [Int64Index([7, 10, 101, 102, 103, 104], dtype='int64')] are in the [columns]"

我做错了什么?

及时,这是一项主要工作的一部分。 我要做的就是过滤所有工作表的某些列,并将它们保存到一个新的 xlsx 文件中(同样,由工作表分隔,但已过滤)


添加我的解决方案以导出具有多个工作表的单个文件

我知道这远非一个漂亮的代码,但它目前正在运行。

dados = pd.read_excel("results/report.xlsx", sheet_name=None)
df = pd.concat(dados[frame] for frame in dados.keys())

lista_colunas = [7, 10, 101, 102, 103, 104]
filtro = df.columns[lista_colunas]
final_df = df[filtro]

grouped_df = final_df.groupby(final_df.columns[1])
salas = grouped_df.groups.keys()

writer = pd.ExcelWriter('results/resultado.xlsx', engine='xlsxwriter')

for sala in salas: 
        splitdf = grouped_df.get_group(sala) 
        splitdf.to_excel(writer, sheet_name=str(sala)) 
writer.save()

【问题讨论】:

    标签: python excel pandas openpyxl


    【解决方案1】:

    d['Seg10_results'][lista_colunas] 基本上是d['Seg10_results][7, 10, 101, 102, 103, 104]lista_colunas 中的所有项目都不是d['Seg10_results'] 中的实际列。

    您可能想要:

    • pandas.DataFrame.iloc (docs) 为例,

      d['Seg10_results'].iloc[:, lista_colunas];或

    • d['Seg10_results'].columns[lista_colunas].values 存储在变量中,即cols 并执行

      d['Seg10_results'][cols].

    【讨论】:

    • 存储值工作正常。先感谢您。但是有可能(可能是)创建一个循环并自动存储所有工作表('Seg10_results')只是一个,默认情况下名称不固定。
    • 去吧。使用此教程将所有内容放入一个数据框中:github.com/marsja/jupyter/blob/master/…,然后将其拆分为一列过滤,使用此答案stackoverflow.com/a/65692842/7444022
    【解决方案2】:

    你不需要加.columns,也不需要values

    代替:

    d['Seg10_results'].columns[lista_colunas].values
    

    试试:

    d['Seg10_results'][lista_colunas]
    

    【讨论】:

    • 如果我这样做,我会收到这个错误 - 我已经用错误更新了问题
    【解决方案3】:

    您的列已命名并编入索引,因此我认为您需要按名称调用它们。

    这是处理数据的最佳方式的代码 sn-p (Pandas DataFrames)

    1.

    import pandas as pd 
       
    btc = pd.read_csv('BTC_Analysis/BTC-USD.csv')
    
    1. dataframe = pd.DataFrame()

      打印(数据帧['日期'])

    对于多个条目,只需添加第二个括号:

    print(dataframe[['Date', 'Open']])
    

    以下是 Pandas 文档中的一些快速信息:

    https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html

    此外,您还可以在tutorial 中找到一些有用的信息

    附言。处理 XLSX 文件可能很麻烦,如果可能,通常最好使用 CSV 格式。

    【讨论】:

    • 这可以工作,但首先,我需要在我的字典中选择 df。
    • 对不起,我错过了那部分;我认为这可能是最理想的方式。将页面拆分为各自的 df 然后从那里开始。 stackoverflow.com/a/26521726/14999516
    • 是的。是我做的。但它创建了一个df字典。现在我无法运行循环来为 dict 中的每个 df 获取选定的 col。
    猜你喜欢
    • 2021-07-09
    • 2016-07-08
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多