对于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
以下是我认为最有效的方法:
所以,我需要根据第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
答案 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