【问题标题】:How to solve pandas issues with iterrows如何使用 iterrows 解决熊猫问题
【发布时间】:2021-07-16 00:06:31
【问题描述】:

我自愿帮助一家乡村图书馆完成他们的一些任务。他们想向他们的成员发送消息。有了他们给我的信息,他们希望得到我稍后展示的输出。 他们有以下.csv 文件(这是一个例子):

import pandas as pd
file= ("biblioteca.csv")
df = pd.read_csv(file, sep=',', dtype='str')
df

这是内容:

    Fecha   Socio   Doc Nombre  Libro   Volumenes   Dias_Vto
0   9/1/2021    1   47890056    Ruben Dario Harry Potter - Espanol  1   28
1   4/2/2021    1   47890056    Ruben Dario Harry Potter - Ingles   1   16
2   3/3/2021    1   47890056    Ruben Dario El pajaro canta hasta morir 1   16
3   1/1/2021    1   47890056    Ruben Dario Criptonomicom   3   35
4   1/2/2021    2   46859754    Ernesto Sabato  Cuentos de la selva 1   6
5   5/3/2021    2   46859754    Ernesto Sabato  Los pajaros 1   12
6   2/2/2021    3   39845712    Jose Sacristan  Vida de un Ausente  1   21
7   2/2/2021    3   39845712    Jose Sacristan  Alter Ego   1   19
8   2/2/2021    3   39845712    Jose Sacristan  Cookbook    5   2

我创建了一些函数,其中包含他们想要发送给成员的信息:

gb = df.groupby(['Socio'])

def nombre(fila):
    return ("Fecha {} Documento {}".format(fila.Fecha, fila.Doc))

def sucursal(fila):
    return ("Sucursal - Monte Castro")

def libros(fila):
    return ("Don {}, retiró el dia {}, el libro: {} que consta de {} volumen/es;1;   {}".format(fila.Nombre, fila.Fecha, fila.Libro, fila.Volumenes, fila.Doc))

def vencimiento(fila):
    return ("El libro {} vence dentro de {} dia/s.  {}".format(fila.Libro, fila.Dias_Vto, fila.Doc))

print('Resumen Biblioteca')

for k, gp in gb:

  for idx, fila in gp.iterrows():
    print('Fecha  - Nombre')
    print(nombre(fila))
    print('Sucursal biblioteca')
    print(sucursal(fila))  
    
   

    print('Libros solicitados')
    for idx, fila in gp.iterrows():
        print(libros(fila))
  
    print('Vencimientos')  
    for idx, fila in gp.iterrows():
        print(vencimiento(fila))
    
    print('FIN Socio - Biblioteca Sucursal - Monte Castro')
print('---------')
print()
print()

迭代的问题在于,它将标题乘以与迭代每一行的行一样多。第一个成员 (Socio) 就是这种情况。

Resumen Biblioteca  
Fecha  - Nombre  
Fecha 9/1/2021 Documento 47890056  
Sucursal biblioteca  
Sucursal - Monte Castro  
Libros solicitados  
Don Ruben Dario, retiró el dia 9/1/2021, el libro: Harry Potter - Espanol que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 4/2/2021, el libro: Harry Potter - Ingles que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 3/3/2021, el libro: El pajaro canta hasta morir que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 1/1/2021, el libro: Criptonomicom que consta de 3 volumen/es;1;   47890056  
Vencimientos  
El libro Harry Potter - Espanol vence dentro de 28 dia/s.  47890056  
El libro Harry Potter - Ingles vence dentro de 16 dia/s.  47890056  
El libro El pajaro canta hasta morir vence dentro de 16 dia/s.  47890056  
El libro Criptonomicom vence dentro de 35 dia/s.  47890056  
FIN Socio - Biblioteca Sucursal - Monte Castro  
Fecha  - Nombre  
Fecha 4/2/2021 Documento 47890056  
Sucursal biblioteca  
Sucursal - Monte Castro  
Libros solicitados  
Don Ruben Dario, retiró el dia 9/1/2021, el libro: Harry Potter - Espanol que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 4/2/2021, el libro: Harry Potter - Ingles que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 3/3/2021, el libro: El pajaro canta hasta morir que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 1/1/2021, el libro: Criptonomicom que consta de 3 volumen/es;1;   47890056      
Vencimientos    
El libro Harry Potter - Espanol vence dentro de 28 dia/s.  47890056  
El libro Harry Potter - Ingles vence dentro de 16 dia/s.  47890056  
El libro El pajaro canta hasta morir vence dentro de 16 dia/s.  47890056
El libro Criptonomicom vence dentro de 35 dia/s.  47890056
FIN Socio - Biblioteca Sucursal - Monte Castro

预期的输出是:

Resumen Biblioteca  
Fecha  - Nombre  
Fecha 9/1/2021 Documento 47890056  
Sucursal biblioteca  
Sucursal - Monte Castro  
Libros solicitados  
Don Ruben Dario, retiró el dia 9/1/2021, el libro: Harry Potter - Espanol que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 4/2/2021, el libro: Harry Potter - Ingles que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 3/3/2021, el libro: El pajaro canta hasta morir que consta de 1 volumen/es;1;   47890056  
Don Ruben Dario, retiró el dia 1/1/2021, el libro: Criptonomicom que consta de 3 volumen/es;1;   47890056  
Vencimientos  
El libro Harry Potter - Espanol vence dentro de 28 dia/s.  47890056  
El libro Harry Potter - Ingles vence dentro de 16 dia/s.  47890056  
El libro El pajaro canta hasta morir vence dentro de 16 dia/s.  47890056  
El libro Criptonomicom vence dentro de 35 dia/s.  47890056  
FIN Socio - Biblioteca Sucursal - Monte Castro

对于每个成员 (Socio)。

同样的情况发生在所有成员身上。 感谢您的帮助!!!

【问题讨论】:

  • 第二个循环中有两个 for 循环,它也在另一个循环中。你需要那么多吗?
  • 第一个循环用于组,第一个内部用于标题,内部两个是库需要向成员显示的信息。石南花的循环问题,这应该只出现一次。里面的 2 工作正常
  • 您不需要为“Libros solicitados”和“Vencimientos”设置 2 个单独的循环。您可以将这些打印件放在第一个 for idx, fila in gp.iterrows(): 中,它会正常工作。
  • 我尝试删除第二个循环,但结果远非预期。它正在重复标题和行 1 到 1.... 这是一场噩梦
  • 您能发布您的预期输出吗?它不必是每一行,只是带有几个例子的一般概念。这样,人们就可以准确地看到您想要的内容。

标签: python-3.x pandas loops iterator


【解决方案1】:

我认为这应该可以满足您的需求。要记住的是不要在第一个循环内第二次迭代gb。而是对fila 进行第二次迭代。

# Necessary change in order to account for the new for structure
def nombre(fila):
    return "Fecha {} Documento {}".format(fila.Fecha.iloc[0], fila.Doc.iloc[0])

for _, fila in gb:
    print('Fecha  - Nombre')
    print(nombre(fila))
    print('Sucursal biblioteca')
    print(sucursal())  

    print('Libros solicitados')
    for _, fila2 in fila.iterrows():
        print(libros(fila2))
        
    print('Vencimientos')  
    for _, fila2 in fila.iterrows():
        print(vencimiento(fila2))

【讨论】:

  • 谢谢,它在不重复标题方面工作得更好,但现在标题有这个输出:Fecha - Nombre Fecha 4 1/2/2021 5 5/3/2021 Name: Fecha, dtype: object Socio: 4 Ernesto Sabato 5 Ernesto Sabato Name: Nombre, dtype: object
  • 你是对的。我编辑了我的答案来解释这一点。
  • Camilo,感谢您的回答,我正在学习 python,这让我思考了很多。我感谢您的帮助!!!我将继续在这个志愿者项目上工作,并吸取新的经验教训。您有什么建议在线了解更多信息?
  • 老实说,任何简单的谷歌搜索都会让你有一个好的开始。但是,我强烈推荐 Keith Galli 的 yt 频道。他有很多关于这个主题的视频,以及一个在pandas 上的介绍视频,观看次数超过一百万,它可能会让你对这个库及其工具有一个更大的了解。
  • 我会在 YouTube 上观看。我还没有将答案标记为有用的声誉,但我非常感谢您的时间和帮助。
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 2022-01-25
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2020-12-31
  • 2015-08-25
  • 1970-01-01
相关资源
最近更新 更多