Пройдите по столбцу, чтобы проверить значение - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь пройти по столбцу файла csv и для каждой итерации проверять, можно ли найти значение в другом файле csv. Лучше было бы проверить, можно ли найти два значения двух столбцов в одной строке в другом CSV-файле.

например:

CSV1 with column 1-10

и

CSV2 with column 1-10

Теперь я ищу определенные строки, которые находятся в column1 и column2 CSV1, и смотрю, смогу ли я найти их в CSV2.

скажем, в CSV1 у нас есть это

      Column 1       Column2
row1: "Hello"        "you"
row2: "How are you"  "me"
row3: "xyz"          "youme"
row4: "xyz"          "meyou"
...
row10:"xyz"          "xyz"

и CSV2

      Column1        Column2
row1: "Hello"        "no"
row2: "How are you"  "me"
row3: "Hello"        "you"
row4: "xyz"          "yes"
...
row10:"xyz"          "xyz"

И я хочу пройтись по строкам CSV1, взять значение column1 и column2 из row1 и посмотреть, смогу ли я найти их в CSV2 (они могут быть в любом столбце в CSV2, но оба будут в одной строке)

Если, например, первая комбинация CSV1 column1 и column2 из row1 может быть найдена в любом row of CSV2 Я хочу иметь True, чтобы указать мне, какая строка существует, а какая нет.

В моем примере я хочу взять «Hello» и «you» из CSV1 row1 и хотите проверить, встречается ли эта комбинация где-нибудь в CSV2, но только если существуют и «Hello», и «you». В противном случае распечатайте false.

Таким образом, он распечатает следующий результат для CSV2

row1: false
row2: false
row3: true
....

До сих пор я использовал isin, поэтому проверьте, существует ли значение, а затем сравните их вручную в excel, что не очень полезно. Было бы лучше построить вокруг него al oop, но я не совсем уверен, как это сделать.

Надеюсь, вы мне поможете.

1 Ответ

0 голосов
/ 05 августа 2020

Есть более простые решения без итераций, если вы используете Numpy массивы и функциональность.

Комментарии объясняют подход

col1 = ["hello","world","to start"]
col2 = ["technology", "python", "pandas", "fullstack"]

# generate some data sets that can have same values in col1 and col2
csv1 = pd.DataFrame(
    [[col1[random.randint(0, len(col1)-1)], col2[random.randint(0, len(col2)-1)]] 
     for i in range(5)], columns=["col1","col2"])
csv2 = pd.DataFrame(
    [[col1[random.randint(0, len(col1)-1)], col2[random.randint(0, len(col2)-1)]] 
     for i in range(20)], columns=["col1","col2"])

# get an array of the unique combinations of col1 and col2 in CSV1
myfind = np.array(csv1.groupby(["col1","col2"])
                  .agg({"col1":"first","col2":"first"}).reset_index(drop=True))

# use numpy isin to add a column to CSV2 if it's found in CSV1
csv2m = csv2.assign(
    # where CSV1 col1 + col2 == CSV2 col1+col2
    found=np.isin(csv2.loc[:,["col1","col2"]].sum(axis=1), myfind.sum(axis=1) ),
    # where CSV2 col1 in CSV1 col1 and CSV2 col2 in CSV1 col2
    partialfound=np.isin(csv2.loc[:,["col1","col2"]], myfind ).all(axis=1))

print(f"CSV1\n{csv1.to_string(index=False)}\n\nCSV2 with matches\n{csv2m.to_string(index=False)}")

вывод

CSV1
     col1        col2
 to start  technology
 to start  technology
    world      pandas
    hello  technology
 to start      pandas

CSV2 with matches
     col1        col2  found  partialfound
    world      python  False         False
 to start  technology   True          True
    hello      python  False         False
 to start      pandas   True          True
    world      python  False         False
    hello      pandas  False          True
    hello   fullstack  False         False
    world      pandas   True          True
 to start      python  False         False
    hello      python  False         False
 to start  technology   True          True
    world  technology  False          True
    world   fullstack  False         False
 to start      python  False         False
    hello   fullstack  False         False
    world      pandas   True          True
    world   fullstack  False         False
    hello   fullstack  False         False
    world   fullstack  False         False
    hello  technology   True          True
...