【问题标题】:Pandas DataFrames - iteration format for itertuplesPandas DataFrames - itertuples 的迭代格式
【发布时间】:2018-02-18 21:50:56
【问题描述】:

对于 pandas DataFrame 中的所有行,我想将行写入一个新的 csv 文件,其中 both 列 1 6 的值与所有列的相应列值匹配其他行,仅写入在不同列中找到的最大值的行 (3)。 (第 1 列包含文本,第 3 列和第 6 列包含整数。)

例如:

    0       1       2   3   4  5    6      
    0       spam        142         6
    1       eggs        212         3
    2       bacon       111         6
    3       eggs        128         3
    4       spam        221         6
    5       spam        144         4
    6       spam        145         6

在上面的示例中,第 0 行的第 1 列和第 6 列值(垃圾邮件,6)与第 4 行和第 6 行的值匹配(都具有“垃圾邮件,6”)。由于第 4 行的第 3 列值 (221) 高于 0 (142) 或 6 (145),我想写第 4 行。此外,第 1 行和第 3 行相互匹配,第 1 行具有更高的第 3 列值 (212 )。

期望的输出,第 1 部分:

1       eggs        212         3
4       spam        221         6 

第 2 部分...某些行将导致不匹配。在那种情况下,我也想写那些行(在上面的例子中,第 2 行和第 5 行没有任何匹配项)。

所以考虑到这两部分,我希望输出写入这些行:

1       eggs        212         3    
2       bacon       111         6
4       spam        221         6
5       spam        144         4 

以下是我认为最有效的方法:

  • 写入一个新列 (7) 并为匹配的行添加整数 1 没有最高的列值。
  • 然后打印行 第 7 列的“不是 1”。

所以,我需要基于第 3 列进行迭代,以某种方式识别那些值小于其他匹配值的行,写入新的第 7 列,并写入第 7 列中没有值的行?

有没有更好的流程来做到这一点?我所知道的是我需要进行某种迭代、掩码或列写入,或三者的某种组合。我在这里看到了几个与迭代相关的问题,但没有一个问题能帮助我理解在这种情况下如何做到这一点。我是 pandas 的新手,但猜测它的开头是这样的:

import csv
import pandas as pd

df1 = pd.read_csv('pyall.csv')
for index, row in df.itertuples():
    mypairmatch = (index[2],index[7]) # stores two column values (1,6) of index

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这可能是您正在寻找的:

    # Starting dataframe:
    #    0      1   2    3   4   5  6
    # 0  0   spam NaN  142 NaN NaN  6
    # 1  1   eggs NaN  212 NaN NaN  3
    # 2  2  bacon NaN  111 NaN NaN  6
    # 3  3   eggs NaN  128 NaN NaN  3
    # 4  4   spam NaN  221 NaN NaN  6
    # 5  5   spam NaN  144 NaN NaN  4
    # 6  6   spam NaN  145 NaN NaN  6
    
    idx = df.groupby(['1', '6'])['3'].transform(max) == df['3']
    
    df[idx]
    
    #    0      1   2    3   4   5  6
    # 1  1   eggs NaN  212 NaN NaN  3
    # 2  2  bacon NaN  111 NaN NaN  6
    # 4  4   spam NaN  221 NaN NaN  6
    # 5  5   spam NaN  144 NaN NaN  4
    

    说明

    df.groupby(['1', '6'])['3'].transform(max) 输出一个序列,为每一行给出最大值groupwise,如下所示:

    # 0    221
    # 1    212
    # 2    111
    # 3    212
    # 4    221
    # 5    144
    # 6    221
    # Name: 3, dtype: int64
    

    df['3'] 仅输出“3”列中的系列:

    # 0    142
    # 1    212
    # 2    111
    # 3    128
    # 4    221
    # 5    144
    # 6    145
    # Name: 3, dtype: int64
    

    当比较这两个系列是否相等时,您只会在索引和值都对齐时看到True

    # 0    False
    # 1     True
    # 2     True
    # 3    False
    # 4     True
    # 5     True
    # 6    False
    # Name: 3, dtype: bool
    

    【讨论】:

    • 在我的实际数据上使用print(idx)0 False 1 True 2 False 等运行时有输出,但这是什么意思?我将使用上面的示例数据运行它,看看我是否能弄清楚。谢谢。
    • 此代码正确生成“真”输出,因为“不匹配”或匹配行的第 3 列值最高。
    • @user3447273,我添加了一个解释 - 希望它有所帮助。
    • 帮助很大。谢谢。你能帮助解决同一个问题的轻微变化吗?如果对于某些行,所有三列 (1,3,6) 都是相同的(没有可供选择的最大值)并且您还想只为其中的一个写一行怎么办?它可能是第一个可用的 - 它不必是随机的。
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2017-03-25
    • 2023-02-26
    • 1970-01-01
    • 2017-11-19
    • 2015-06-02
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多