【问题标题】:Locating a row based on a cell value根据单元格值定位行
【发布时间】:2019-01-01 03:10:13
【问题描述】:

//编辑:这个问题是一个子问题。更短更好的例子,有更好的回复,检查This Post

我对 python 非常陌生,甚至对 pandas 也很陌生。 我已经使用它至少一个月了,我想我已经掌握了大部分基础知识。

我当前的任务是将值写入 xslx 文件内的特定空间中的特定单元格中。

情况

  • 我有一个非常大的 excel 文件,其中包含各种数据,从名称到 电子邮件地址和一切。我还有两个列表(.txt 文件) 与其中的 excel 文件相同的电子邮件地址,但那些 如果电子邮件符合某些安全检查或 不是。根据结果​​,它们被存储在 “Secured.txt”或“Unsecured.txt”文件。

  • 要在 excel 文件中写入和读取,我使用 pandas。

任务

在 excel 文件中的“电子邮件”列旁边,有一个列,您可以在该列中标记电子邮件是安全的还是不安全的。我的实际任务是插入这些条目,具体取决于电子邮件所在的文本文件。

可能的解决方案

我解决这个问题的方法是读出每个 .txt 文件,并使用列表和 for 循环将每个电子邮件地址存储在一个变量中。遍历这些电子邮件,我知道想要在 excel 文件中查找电子邮件地址的位置并访问它旁边的单元格。 同一行,不同的列。由于电子邮件之前已对其安全验证进行了排序匹配,因此我只需将相应的值放入电子邮件旁边的验证单元格中即可。

问题

我的问题如下:如何根据其中的值处理特定行? 我想找到包含变量“mails”的实际内容的单元格的位置,所以我可以移动到它旁边的单元格。由于我知道所有列的名称,我实际上只需要电子邮件所在行的索引。我得到了 x 坐标并需要 y 坐标。

示例

到目前为止,我所拥有的是 .txt 文件的读数:

import pandas as pd
import os
import re


#fetching the mail adress through indexnumber out of the list
with open('Protected/Protected G.txt', 'r') as file:

    #creating the regex pattern to sort out the mail adresses
    rgx = '\S+@\S+'

    #read the file and convert the list into a string
    content = file.readlines()
    content_str = ''.join(content)

    #get the mails out of the "list" with regex
    mails = re.findall(rgx, content_str)

    #put each mailadress in a variable
    for item in mails:
        print(item)

这个虚拟数据框代表我正在使用的 excel 表:

Dummy-Dataframe:

    Forename    Last Name   Email           Protection

1   John        Kennedy     John@gmx.net

2   Donald      Trump       Donald@gmx.net

3   Bill        Clinton     Bill@gmx.net

4   Richard     Nixton      Richard@gmx.net

我知道想要将存储在变量“item”中的实际地址传递给 pandas 的某种“定位”功能以便找出实际电子邮件位于哪一行。 一旦我知道地址在哪一行,我现在可以告诉 pandas 在下一列中写一个“x”,表示邮件受到保护,或者写一个“o”,表示邮件不受保护。

我完成的数据框可能如下所示:

Finished Dataframe:

    Forename    Last Name   Email           Protection

1   John        Kennedy     John@gmx.net    x

2   Donald      Trump       Donald@gmx.net  o

3   Bill        Clinton     Bill@gmx.net    x

4   Richard     Nixton      Richard@gmx.net x

非常感谢您的帮助。

【问题讨论】:

  • 这个和问题无关,但是可以直接使用for adress in mails:。这样你就不需要计算长度也不需要使用range
  • 改变了这个。赞赏。
  • 对不起,我没有解释清楚。通过替换范围循环,您不再需要执行adress = mails[item]。已经分配了正确的值,可以使用它们,例如for adress in mails: print(adress)
  • 能否请您发布一个类似于您的数据的虚拟数据框和预期的输出数据框(您想要写入 excel 的方式)。谢谢你。 :)
  • 这似乎是this one 的副本?

标签: python excel pandas


【解决方案1】:

为了确保我了解您有一个受保护的文本文件和一个不受保护的文本文件。我在做一个很大的假设,你从来没有在这两个中收到电子邮件。

import pandas as pd

df = pd.read_csv('Protected/Protected G.txt', header = None, sep = " ")
df.columns = ['Protected Emails']

df2 = pd.read_excel('dummy-excel')

if df2['Email'].isin(df) :
    df2['Protection'] = 'x'
else :
    df2['Protection'] = 'o'

writer = pd.ExcelWriter('ProtectedEmails.xlsx')
df2.to_excel(writer,'Sheet1') #or whatever you want to name your sheet
writer.save()

可能是这样的,虽然我不知道电子邮件的文本文件是什么样的。

【讨论】:

  • 这是一个很好的答案。首先,澄清一下:是的,我有一个单独的文本文件用于受保护,一个用于不受保护。您的假设是正确的,两者都没有电子邮件,因为它只能受保护或不受保护。由于这个问题太长、太复杂和令人困惑,我参考了另一个问题,它显示了相同的内容,但要小得多。但是对于这篇文章,你完全回答了我的问题。谢谢!
【解决方案2】:

您的问题与内容不同。这是一个简单的答案,可能以某种方式有用。

假设这是一个数据框: Z = pd.DataFrame([1,2,4,6])

现在,让我们访问数字 4。只有一列。通常,第一列被分配名称 0 作为标题。所需的数字 4 存在于数据帧的第三位。由于 python 从 0 开始列表、dfs、数组等的索引,所以数字 4 的索引数为 2。

print(Z[0][2])

这将输出 [4]

尝试对您的数据应用相同的内容。只是男性肯定知道标题的名称。有时它们不是数字,而是字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2015-01-17
    相关资源
    最近更新 更多