Pandas: сравнивать все значения в кадре данных по строкам - PullRequest
3 голосов
/ 30 апреля 2020

Я пытаюсь сопоставить строки и объединить их в одну строку.

Например, для приведенной ниже таблицы я хочу объединить первые три строки, потому что они похожи. 4-й не похож. В моем чеке я ничего не делаю для любой строки, у которой столбец 1 равен B. И затем снова агрегирование для двух последних строк:

|---------------------|------------------|------------------|
|      Col 1          |     Col 2        |       Col 3      |
|---------------------|------------------|------------------|
|        A            |       12st       |        13        |
|---------------------|------------------|------------------|
|        A            |       12st       |        13        |
|---------------------|------------------|------------------|
|        A            |       12st       |        13        |
|---------------------|------------------|------------------|
|        A            |       12st       |        17        |
|---------------------|------------------|------------------|
|        B            |       11aa       |        10        |
|---------------------|------------------|------------------|
|        C            |       10ee       |        10        |
|---------------------|------------------|------------------|
|        C            |       10ee       |        10        |
|---------------------|------------------|------------------|
df = pd.DataFrame({'Col 1': ['A', 'A', 'A','A', 'B', 'C', 'C'],'Col 2': ['12st', '12st', '12st', '12st', '11aa' ,'10ee','10ee'],'Col 3': [13, 13, 13, 17, 10, 10, 10 ]})


Я хочу получить следующий вывод:

|---------------------|------------------|------------------|---------------|
|      Col 1          |     Col 2        |       Col 3      |    Col 4      |
|---------------------|------------------|------------------|---------------|
|        A            |       12st       |        13        |      3        |
|---------------------|------------------|------------------|---------------|
|        A            |       12st       |        17        |      1        |
|---------------------|------------------|------------------|---------------|
|        B            |       11a        |        10        |      1        |
|---------------------|------------------|------------------|---------------|
|        C            |       10ee       |        10        |      2        |
|---------------------|------------------|------------------|---------------|

Я пробовал более простые вещи, такие как df.shift (), но, похоже, это работает только для определенного c столбца, а не строки. Кроме того, я хочу сделать это итеративно для строк (i), которые он продолжает сопоставлять (i == i + 1 == i + 2).

Спасибо

Ответы [ 2 ]

5 голосов
/ 30 апреля 2020

Я думаю groupby.size может сделать это как:

print (df.groupby(['Col 1','Col 2', 'Col 3']).size().reset_index(name='Col 4'))
  Col 1 Col 2  Col 3  Col 4
0     A  12st     13      3
1     A  12st     17      1
2     B  11aa     10      1
3     C  10ee     10      2
0 голосов
/ 30 апреля 2020

Я думаю, что вы, вероятно, делаете что-то вроде этого:

output_data = []

for i,row in range(rows):
    current_row = df.iloc[i]
    try:
        # check if row is in output_data
        output_data.index(current_row)
    except:
        output_data.append(current_row)

# Create a new dataframe
new_df = pd.DataFrame(output_data)

Пожалуйста, дайте мне знать, если это поможет! : D Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...