Pandas DataFrames - 迭代的迭代格式

时间:2018-02-18 21:50:56

标签: python pandas

对于pandas DataFrame中的所有行,我想将行写入新的csv文件,其中 列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 没有最高的列值。
  • 然后只打印那些行 是不是1'第7栏。

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

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

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

1 个答案:

答案 0 :(得分: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