Как преобразовать кортеж в фрейм данных Pandas

#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:

Из вывода, который вы показываете, он выглядит как кортеж, содержащий два элемента:

  1. Фрейм данных Pandas (с двумя столбцами, а не с 3)
  2. Словарь, содержащий метаданные.

Вы можете проверить это, используя следующие команды:

 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. Да, я так и сделал, но это не очень помогло.