#python #mysql #pandas #dataframe
#python #mysql #pandas #фрейм данных
Вопрос:
Новичок в pandas и python, поэтому заранее благодарю вас. У меня есть таблица
# Create DataFrame
data = [{'analyte': 'sample1'},
{'analyte': 'bacon', 'CAS1': 1},
{'analyte': 'eggs', 'CAS1': 2},
{'analyte': 'money', 'CAS1': 3, 'CAS2': 1, 'Value2': 1.11},
{'analyte': 'shoe', 'CAS1': 4},
{'analyte': 'boy', 'CAS1': 5},
{'analyte': 'girl', 'CAS1': 6},
{'analyte': 'onion', 'CAS1': 7, 'CAS2': 4, 'Value2': 6.53},
{'analyte': 'sample2'},
{'analyte': 'bacon', 'CAS1': 1},
{'analyte': 'eggs', 'CAS1': 2, 'CAS2': 1, 'Value2': 7.88},
{'analyte': 'money', 'CAS1': 3},
{'analyte': 'shoe', 'CAS1': 4, 'CAS2': 3, 'Value2': 15.5},
{'analyte': 'boy', 'CAS1': 5},
{'analyte': 'girl', 'CAS1': 6},
{'analyte': 'onion', 'CAS1': 7}]
df = pd.DataFrame(data)
Перед записью фрейма данных Pandas в таблицу базы данных MySQL мне нужно разделить df на отдельные таблицы, а затем записать каждую таблицу в Mysql
Как разделить df по столбцам, что-то вроде, если имя столбца содержит строку «cas1», затем разделить df
for col in df.columns:
if "cas1" in col:
dfCas1 = df.split
#add uniq index to indetify to which row belongs to
if "cas2" in col:
dfCas2 = df.split
#add uniq index to indetify to which row belongs to
if {"analyte","id" .etc } in col: # main table
dfMain = df.split
dfMain.to_sql("Main", dbConnection, if_exists='fail')
dfCas1.to_sql("cas1", dbConnection, if_exists='fail')
dfCas2.to_sql("cas2", dbConnection, if_exists='fail')
Ответ №1:
Я не совсем уверен, чего вы хотите достичь, но я чувствую, что вы хотите сделать что-то вроде разделения этого:
--------- ---- ------ -------- ------ --------
| Analyte | id | CAS1 | value1 | Cas2 | Value2 |
--------- ---- ------ -------- ------ --------
| | | | | | |
--------- ---- ------ -------- ------ --------
для этого:
--------- ---- ------ -------- ------ --------
| Analyte | id | | CAS1 | value1 | | Cas2 | Value2 |
--------- ---- ------ -------- ------ --------
| | | | | | | | |
--------- ---- ------ -------- ------ --------
Первый получается путем вызова, например df.loc[:, ['Analyte', 'id']]
. Для других измените имена столбцов.
Теперь для индекса uniq, который находится в ваших комментариях к коду, df.loc[:]
сохраняет индекс исходной таблицы. Вы можете использовать df.reset_index(), чтобы сбросить его до уникального целочисленного индекса. Если вы также хотите удалить пустые строки в одной из ваших вложенных таблиц перед синтаксическим анализом, взгляните на df.dropna() .
Комментарии:
1. да, но каждая таблица должна содержать еще один столбец «UniqIndex»
2. Является ли этот UniqIndex в настоящее время индексом вашего фрейма данных? Если это так, просто вызовите df.reset_index(drop=False) . Если нет, вызовите его дважды! В зависимости от того, как назван новый столбец, вы можете впоследствии вызвать
df.rename(index={'oldname':'UniqIndex'})
3. да и нет, это должно быть лучше всего, хэш каждого md5 (анализируемого вещества), я обновляю вопрос
4.Я думаю, это сработает:
import hashlib
df.loc[:, 'Uniq'] = df.loc[:, 'Analyte'].str.encode('utf8').apply(lambda x: (hashlib.md5(x).hexdigest()))
5. Я бы просто добавил обратный выбор:
inv_selection = [col for col in df.columns if col not in selection]
а затем использовал inv_selection в .loc
Ответ №2:
Я не уверен на 100%, что это то, что вы имеете в виду, но:
dfCas1 = df[df.col.str.contains('cas1')]
dfCas2 = df[df.col.str.contains('cas2')]
dfMain = df[~((df.col.str.contains('cas2')) amp; df.col.str.contains('cas1'))]
Знак ~ отменяет выбор и означает все строки, в которых столбцы не содержат cas1 и cas2. Я надеюсь, что это имеет смысл.
Комментарии:
1. Но если мне нужно несколько значений contains для dfCas1? и как добавить индекс uniq к каждому df, чтобы я мог проверить, из каких строк приходят поля в других df, скажем, analyte — это Product, а другие столбцы — это атрибуты продукта, поэтому я должен знать, где найти каждый атрибут products it
2. Ошибка атрибута: объект ‘DataFrame’ не имеет атрибута ‘col’
3. col здесь должен быть заменен вашим именем столбца. Но я вижу, что вы нашли свой ответ.