Добавить еще два столбца в CSV-файл на основе сопоставления значений других CSV-файлов - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть два файла CSV

CSV1:

enter image description here

CSV2:

enter image description here

Что мне нужно для обработки:

Получить каждое значение столбца c файла csv1 и сопоставить его со столбцом число из CSV2.

Если какая-либо строка csv2 совпадает с этим номером, то добавьте новый столбец c_text в csv1, который будет содержать значение text столбца для соответствующей строки csv2

Повторите описанный выше процесс для столбца d из csv1 и добавьте новый столбец d_text в csv1

Вот что мне нужно в конце

enter image description here

Я новичок в пандах.Как я могу сделать это, используя панд.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете использовать apply():

csv1['c_text'] = csv1['c'].apply(lambda x: csv2[csv2['number']==x]['text'].values[0])
csv1['d_text'] = csv1['d'].apply(lambda x: csv2[csv2['number']==x]['text'].values[0])

Выход:

   a  b    c    d c_text d_text
0  1  4  101  201   val1   val4
1  2  5  105  202   val2   val5
2  3  6  107  203   val3   val6

С точки зрения опции, использующей merge(), это даст тот же результат:

csv1 = csv1.merge(csv2, left_on='c', right_on='number', how='left')
csv1 = csv1.merge(csv2, left_on='d', right_on='number', how='left')
csv1 = csv1.rename(columns={'text_x': 'c_text', 'text_y': 'd_text'})[['a','b','c','d','c_text','d_text']]
0 голосов
/ 28 сентября 2018

Вот кое-что, что поможет:

df1 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c':[101, 105, 107], 'd':[201, 202, 203]})

df2 = pd.DataFrame({'number': [101, 105, 107, 201, 202, 203, 205, 2010, 310], 'text': ["val_{x}".format(x=y + 1) for y in range(9)]})

df1

   a  b    c    d
0  1  4  101  201
1  2  5  105  202
2  3  6  107  203

df2

   number   text
0     101  val_1
1     105  val_2
2     107  val_3
3     201  val_4
4     202  val_5
5     203  val_6
6     205  val_7
7    2010  val_8
8     310  val_9
merged = df1.merge(df2, left_on='c', right_on='number', how='left')

merged

   a  b    c    d  number   text
0  1  4  101  201     101  val_1
1  2  5  105  202     105  val_2
2  3  6  107  203     107  val_3

output = merged.merge(df2, left_on='d', right_on='number', how='left')[['a', 'b', 'c', 'd', 'text_x', 'text_y']]

output

   a  b    c    d text_x text_y
0  1  4  101  201  val_1  val_4
1  2  5  105  202  val_2  val_5
2  3  6  107  203  val_3  val_6
0 голосов
/ 28 сентября 2018

То, что вы хотите, это функциональность слияния Панд.Предполагая, что вы импортировали модуль Pandas с сокращенным именем, таким как import pandas as pd, тогда:

csv1_with_text_col = pd.merge(csv1, csv2, left_on='c', right_on='number', how='left')

Это даст вам новый фрейм данных csv1_with_text_col, в котором столбцы из csv2 объединены в csv1, где csv1 ['c'] == csv2 [' number '].Кроме того, указав how='left', будут сохранены только строки из левого фрейма данных csv1.

Затем вы можете объединить этот новый фрейм данных csv1_with_text_col с csv2, но с left_on='d'.

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