【问题标题】:How to loop over a dataframe and create list如何遍历数据框并创建列表
【发布时间】:2021-07-16 14:54:10
【问题描述】:

所以,我在下面有以下数据,我想遍历数据框并执行一些函数,最后将函数的结果保存在列表中。我无法创建列表。我只在列表中得到一个值,而不是我打算得到的两种方法。谁有更有效的方法来解决这个问题,请分享。


     dict = {'PassengerId' : [0.0, 0.001, 0.002, 0.003, 0.004, 0.006, 0.007, 0.008, 0.009, 0.01], 
'Survived' : [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], 
'Pclass' : [1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.5],
'Age' : [0.271, 0.472, 0.321, 0.435, 0.435, np.nan, 0.673, 0.02, 0.334, 0.171], 
'SibSp' : [0.125, 0.125, 0.0, 0.125, 0.0, 0.0, 0.0, 0.375, 0.0, 0.125], 
'Parch' : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.167, 0.333, 0.0], 
'Fare' : [0.014, 0.139, 0.015, 0.104, 0.016, 0.017, 0.101, 0.041, 0.022, 0.059]}


        
import pandas as pd
dicts = pd.DataFrame(dicts, columns = dicts.keys())
def Mean(self):
    list_mean = []
    list_all = []
    for i, row in dicts.iterrows():
        if (row['Age'] > 0.2) & (row['Fare'] < 0.1):
            list_all.append(row['PassengerId'])
        elif (row['Age'] > 0.2) & (row['Fare'] > 0.1):
            list_all.clear()
            list_all.append(row['PassengerId'])
    return list_mean.append(np.mean(list_all))
            
               
Mean()

请帮忙!!

【问题讨论】:

  • 如果我正确理解了这个问题,那么您只会得到列表中的项目,那是因为一旦满足数据框中第一个值的 if 条件,您就会返回。我相信您应该返回最终值,即在 for 循环完成时返回。
  • @SomuSinhhaa 感谢您的回复,但是我能够解决问题,我现在有一个新的挑战,您能帮我检查一下吗?我已经修改了代码。
  • 对不起,我仍然看到你的旧代码,你试图在 if 块中返回。您应该按照答案之一中所述返回,即仅在您将所有列表元素存储在 list_mean 之后,即在完成 for 循环之后。此外,如果您有其他问题,我建议您打开一个新线程。
  • @SomuSinhhaa 我已经编辑了它,你现在可以检查它。
  • 请您详细说明这一行。它不是很清楚“我只在列表中获得一个值,而不是我打算获得的两个手段”我猜但不确定您是否要附加到列表中,以防您的任何一个条件匹配然后在这种情况下你必须使用逻辑或来组合这两个条件而不是 if elif

标签: python function loops class dictionary


【解决方案1】:

您必须在解决方案中进行一些更改才能解决此问题。对于矢量化答案,请查看我的代码部分。

1.

返回语句return list_mean应该放在function block而不是if-block

更改:

. . .         
if (row['Age'] > self.age) & (row['Fare'] < self.fare):
                list_mean.append(row['PassengerId'])
                return list_mean            
. . .

收件人:

. . .
list_mean = []
for i, row in dicts.iterrows():
    if (row['Age'] > self.age) & (row['Fare'] < self.fare):
         list_mean.append(row['PassengerId'])
return list_mean
. . .

代码:(Vectorized-Version-Solution)无需定义显式类来执行此操作

import numpy as np
dict_ = {
    'PassengerId':
    [0.0, 0.001, 0.002, 0.003, 0.004, 0.006, 0.007, 0.008, 0.009, 0.01],
    'Survived': [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0],
    'Pclass': [1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.5],
    'Age':
    [0.271, 0.472, 0.321, 0.435, 0.435, np.nan, 0.673, 0.02, 0.334, 0.171],
    'SibSp': [0.125, 0.125, 0.0, 0.125, 0.0, 0.0, 0.0, 0.375, 0.0, 0.125],
    'Parch': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.167, 0.333, 0.0],
    'Fare':
    [0.014, 0.139, 0.015, 0.104, 0.016, 0.017, 0.101, 0.041, 0.022, 0.059]
}

import pandas as pd
dicts = pd.DataFrame(dict_, columns=dict_.keys())

l1 = dicts['PassengerId'][np.logical_and(dicts['Age'] > 0.2, dicts['Fare'] < 0.1)]
l2 = dicts['PassengerId'][np.logical_and(dicts['Age'] > 0.2, dicts['Fare'] > 0.1)]

print( (sum(list(l1))/len(l1), sum(list(l2))/len(l2)) )

输出:

(0.00375, 0.0036666666666666666)

【讨论】:

  • 我编辑了这个问题,你能帮我用最有效的方法解决它吗?
  • @deeplearningEngineer 请检查解决方案并让我知道任何问题
  • 感谢回复,看起来不错。但是,我希望是否有办法使用循环来做到这一点?该代码是较大代码的一部分,循环并且没有大块代码@Exploore X会很有效
【解决方案2】:
import pandas as pd
import numpy as np

dict = {'PassengerId' : [0.0, 0.001, 0.002, 0.003, 0.004, 0.006, 0.007, 0.008, 0.009, 0.01],
'Survived' : [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0],
'Pclass' : [1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.5],
'Age' : [0.271, 0.472, 0.321, 0.435, 0.435, np.nan, 0.673, 0.02, 0.334, 0.171],
'SibSp' : [0.125, 0.125, 0.0, 0.125, 0.0, 0.0, 0.0, 0.375, 0.0, 0.125],
'Parch' : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.167, 0.333, 0.0],
'Fare' : [0.014, 0.139, 0.015, 0.104, 0.016, 0.017, 0.101, 0.041, 0.022, 0.059]}

df = pd.DataFrame(dict, columns = dict.keys())

def calculate_mean():
    l1, l2 = [], []
    for i, row in df.iterrows():
        if row['Age'] > 0.2 and row['Fare'] < 0.1:
            l1.append(row['PassengerId'])
        elif row['Age'] > 0.2 and row['Fare'] > 0.1:
            l2.append(row['PassengerId'])
    return np.mean(l1), np.mean(l2)


print(calculate_mean()) # (0.00375, 0.0036666666666666666)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2023-02-04
    • 2023-01-19
    相关资源
    最近更新 更多