#python #pandas
Вопрос:
Я попытался преобразовать текущий кортеж (я не уверен, действительно ли это кортеж) в pandas DF с помощью другого подхода, но я не смог этого сделать. Кто-нибудь может мне помочь?
Вот мой код:
Please note that my columns should be:
"USGS:06730500:00060:00003","USGS:06730500:00060:00003_qualifiers", "datetimeUTC"
longmont_discharge = hf.extract_nwis_df(longmont_resp)
longmont_discharge
Вот результат:
Output:
( USGS:06730500:00060:00003
datetimeUTC
1946-05-10 00:00:00 00:00 16.00
1946-05-11 00:00:00 00:00 19.00
1946-05-12 00:00:00 00:00 9.00
1946-05-13 00:00:00 00:00 3.00
1946-05-14 00:00:00 00:00 7.80
... ...
2018-08-25 00:00:00 00:00 9.86
2018-08-26 00:00:00 00:00 7.02
2018-08-27 00:00:00 00:00 4.05
2018-08-28 00:00:00 00:00 2.67
2018-08-29 00:00:00 00:00 3.36
USGS:06730500:00060:00003_qualifiers
datetimeUTC
1946-05-10 00:00:00 00:00 A
1946-05-11 00:00:00 00:00 A
1946-05-12 00:00:00 00:00 A
1946-05-13 00:00:00 00:00 A
1946-05-14 00:00:00 00:00 A
... ...
2018-08-25 00:00:00 00:00 A
2018-08-26 00:00:00 00:00 A
2018-08-27 00:00:00 00:00 A
2018-08-28 00:00:00 00:00 A
2018-08-29 00:00:00 00:00 A
[26410 rows x 2 columns],
{'USGS:06730500': {'siteName': 'BOULDER CREEK AT MOUTH NEAR LONGMONT, CO',
'siteLatLongSrs': {'srs': 'EPSG:4326',
'latitude': 40.13877778,
'longitude': -105.0202222},
'timeSeries': {'00060': {'variableFreq': '<Day>',
'variableUnit': 'ft3/s',
'variableDescription': 'Discharge, cubic feet per second',
'methodID': '17666',
'methodDescription': ''}}}})
Вот мой метод преобразования его в df:
df = pd.DataFrame(longmont_discharge, columns=[ "USGS:06730500:00060:00003",
"USGS:06730500:00060:00003_qualifiers","datetimeUTC"])
Я также попробовал df = pd.DataFrame.from_records, И вот ошибка, которую я получаю:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-40-5bed67d5f15e> in <module>
1 #Convert tuple into Pandas DF:
----> 2 df = pd.DataFrame(longmont_discharge, columns=[ "USGS:06730500:00060:00003",
3 "USGS:06730500:00060:00003_qualifiers", "datetimeUTC"])
~anaconda3envsmyenvearthpylibsite-packagespandascoreframe.py in __init__(self, data, index, columns, dtype, copy)
709 )
710 else:
--> 711 mgr = ndarray_to_mgr(
712 data,
713 index,
~anaconda3envsmyenvearthpylibsite-packagespandascoreinternalsconstruction.py in ndarray_to_mgr(values, index, columns, dtype, copy, typ)
302 # by definition an array here
303 # the dtypes will be coerced to a single dtype
--> 304 values = _prep_ndarray(values, copy=copy)
305
306 if dtype is not None and not is_dtype_equal(values.dtype, dtype):
~anaconda3envsmyenvearthpylibsite-packagespandascoreinternalsconstruction.py in _prep_ndarray(values, copy)
538 # and platform dtype preservation
539 if is_list_like(values[0]):
--> 540 values = np.array([convert(v) for v in values])
541 elif isinstance(values[0], np.ndarray) and values[0].ndim == 0:
542 # GH#21861 see test_constructor_list_of_lists
~anaconda3envsmyenvearthpylibsite-packagespandascoreinternalsconstruction.py in <listcomp>(.0)
538 # and platform dtype preservation
539 if is_list_like(values[0]):
--> 540 values = np.array([convert(v) for v in values])
541 elif isinstance(values[0], np.ndarray) and values[0].ndim == 0:
542 # GH#21861 see test_constructor_list_of_lists
~anaconda3envsmyenvearthpylibsite-packagespandascoreinternalsconstruction.py in convert(v)
531
532 v = extract_array(v, extract_numpy=True)
--> 533 res = maybe_convert_platform(v)
534 return res
535
~anaconda3envsmyenvearthpylibsite-packagespandascoredtypescast.py in maybe_convert_platform(values)
122 arr = values
123
--> 124 if arr.dtype == object:
125 arr = cast(np.ndarray, arr)
126 arr = lib.maybe_convert_objects(arr)
AttributeError: 'dict' object has no attribute 'dtype'
Комментарии:
1. Не могли бы вы, пожалуйста, предоставить небольшую выборку ваших материалов?
Ответ №1:
Из вывода, который вы показываете, он выглядит как кортеж, содержащий два элемента:
- Фрейм данных Pandas (с двумя столбцами, а не с 3)
- Словарь, содержащий метаданные.
Вы можете проверить это, используя следующие команды:
print(type(longmont_discharge))
print(len(longmont_discharge))
print([type(item) for item in longmont_discharge])
Если это кортеж, содержащий фрейм данных и словарь, попробуйте следующее:
df, info = longmont_discharge
Похоже, вам нужно пройти обучение по кортежам Python и тому, как индексировать их элементы. И ознакомьтесь с этим руководством по распаковке кортежей. Это метод, который я использовал выше, чтобы присвоить содержимое кортежа переменным.
Комментарии:
1. Спасибо вам за ответ. Я запустил код, и вот результат:
python Input: print(type(longmont_discharge)) print(len(longmont_discharge)) print([type(item) for item in longmont_discharge]) Output: <class 'tuple'> 2 [<class 'pandas.core.frame.DataFrame'>, <class 'dict'>]
Но код df, info вернул тот же результат: я хотел бы иметь таблицу, которая выглядит так, как показано в следующей ссылке: github.com/Ali-UPT/test.git У меня должно быть три колонки. Не могли бы вы, пожалуйста, сообщить мне, как решить эту проблему?2. Это подтверждает тип, размер и содержимое кортежа. Как сказал @AdamRadounis, вам придется предоставить нам некоторый код для генерации
longmont_discharge
, потому что я не могу знать, является лиdf
извлеченный с помощью моего ответа кадр данных, который вы хотите, или нет. Пожалуйста, добавьте это к вопросу.3. @Ali Вы просмотрели учебник, на который я ссылался в своем ответе? Теперь вы понимаете, как распаковывается кортеж?
4. Да, я так и сделал, но это не очень помогло.