【问题标题】:What is the best way to iterate over Pandas rows in my case?在我的情况下,迭代 Pandas 行的最佳方法是什么?
【发布时间】:2021-10-31 20:48:05
【问题描述】:

我在 Pandas Rows 上的迭代存在复杂性问题。我有一个包含超过 30k 行的数据集,我需要为每一行添加一个新列,其中包含来自特定列的值。

belongs_node_df = pd.DataFrame.from_records(belongs_node, columns=['hashtag', 'tweets_id', 'tokenized_text','sentiment_compound'])
posted_node_df = pd.DataFrame.from_records(posted_node, columns=['username', 'num_followers', 'tweets_id'])
df_user_hashtag = pd.merge(posted_node_df, belongs_node_df, on='tweets_id', how='outer').sort_values('username')
df_user_hashtag['p'] = None

for i in range(len(df_user_hashtag)):
    df_user_hashtag['p'][i] = 3 * df_user_hashtag['num_followers'][i]\df_user_hashtag['sentiment_compound'][i]

有一种有效的方法可以对每一行进行此操作吗?非常感谢。 :)

【问题讨论】:

  • 删除 for 循环。从最后一行中删除 [i]
  • 并使用另一个斜线字符进行除法
  • 那么,如果我删除 for 循环,如何为每一行添加一个新值?
  • 你已经得到了答案……

标签: python pandas dataframe performance memory-efficient


【解决方案1】:

您不应该遍历行...这几乎破坏了您从使用 pandas 获得的所有好处。

df_user_hashtag['p'] = 3 * df_user_hashtag['num_followers'] / df_user_hashtag['sentiment_compound']

【讨论】:

  • 你建议我做什么而不是迭代?谢谢:)
  • 谷歌“熊猫矢量化”并阅读一些文章
【解决方案2】:
import pandas as pd

df = pd.read_excel('/content/Endereços CS 2021.xlsx')

data = df.values.tolist()

for d in data:
    print(d)

在这个例子中,我读取了我的 excel 文件,然后使用方法将其转换为列表 .values.tolist() 然后我做了我之前所说的,我遍历列表中的每一行。

输出结果是:

['Ana Lara', 'Alfa', 'Amigo']
['Ana Suely', 'Alfa', 'Amigo']
['Izabelly', 'Alfa', 'Amigo']
['Carol Loiola', 'Alfa', 'Amigo']
['Yasmin', 'Alfa', 'Amigo']
['Mariana', 'Alfa', 'Amigo']
['Tereza', 'Alfa', 'Amigo']
['Rívia', 'Alfa', 'Amigo']
['Stefany', 'Alfa', 'Amigo']
['Maria Eduarda', 'Alfa', 'Amigo']
['Meyssa', 'Alfa', 'Amigo']
['Arthur Figueiró', 'Epsilon', 'Amigo']
['Andriw', 'Epsilon', 'Amigo']
['Gabriel', 'Epsilon', 'Amigo']
['Tiago ', 'Epsilon', 'Amigo']
['João Pedro', 'Epsilon', 'Amigo']
['Carlos', 'Epsilon', 'Amigo']
['José Neto', 'Epsilon', 'Amigo']
['Raissa ', 'Beta', 'Pesquisador']
['Lara Yasmin', 'Beta', 'Pesquisador']
['Letícia', 'Beta', 'Pesquisador']
['Thalita Melo', 'Beta', 'Pesquisador']
['Isabel', 'Beta', 'Pesquisador']
['Melyssa', 'Beta', 'Excursionista']
['Sarah Gabrielle', 'Beta', 'Excursionista']
['Daniel Fernandes', 'Delta', 'Pioneiro']
['Arthur Soares', 'Delta', 'Pioneiro']
['Guido', 'Delta', 'Pioneiro']
['Emanoel', 'Delta', 'Pioneiro']
['Flávio', 'Delta', 'Pioneiro']
['Iohannes', 'Delta', 'Pioneiro']
['Lucas', 'Delta', 'Pesquisador']
['Beatriz Gillianne (Bia)', 'Sigma', 'Guia']
['Emilly Vitória', 'Sigma', 'Excursionista']
['Adriana', 'Sigma', 'Guia']
['Jade', 'Sigma', 'Guia']
['Sarah Leocádio', 'Sigma', 'Guia']
['Maria Eduarda', 'Sigma', 'Guia']

【讨论】:

    【解决方案3】:

    我使用 cmets 的 @Riley 建议解决了这个问题。

    首先,我创建了一个函数来获取我想要的值:

    def get_p(tfidf, num_followers, compund):
        return (tfidf * num_followers) * compund
    

    其次,我使用 Numpy 的 vectorize 函数来调用我的函数使用向量化:

    vfunc = numpy.vectorize(get_p)
    df_user_hashtag['p'] = vfunc(1, df_user_hashtag['num_followers'], df_user_hashtag['sentiment_compound'])
    

    就是这样!

    【讨论】:

    • numpy.vectorize 不是真正的矢量化。它基本上是一个带有矢量化语法for循环:“提供vectorize函数主要是为了方便,而不是为了性能。实现本质上是一个for循环。” Joran's answer 是真正的矢量化。
    【解决方案4】:

    您可以使用方法 .tolist() 并遍历列表的每一行

    【讨论】:

    • 这种方式效率更高?我发现它和我的方式一样复杂。
    • 某事更复杂并不意味着更高效,您必须尝试两种方法,看看哪种方式对您更有效。
    • 我会创建一个代码给你看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多