【问题标题】:How to read .data format data with Python?如何使用 Python 读取 .data 格式的数据?
【发布时间】:2020-12-16 20:21:18
【问题描述】:

我已从 https://archive.ics.uci.edu/ml/machine-learning-databases/arrhythmia/ 上传数据。如您所见,它具有 .data 格式。如何在 Python 中将其读取为 pandas datframe?

我试试这个。但它确实有效:

with open("arrhythmia.data", "r") as f:
    arryth_df = pd.DataFrame(f.read())

它说 ValueError: DataFrame 构造函数没有正确调用!

【问题讨论】:

  • @jezrael 是的,你说的是对的。认为列名部分仍不清楚
  • 我检查了arrhythmia.names,但这里只是描述,似乎有些值应该通过重命名df =df.rename(columns=0:'col1', 1:'col2')来更改
  • 如果可能,可以使用names= ['col1','col2','col3',...] 等列的所有名称创建列表,可以使用df = pd.read_csv(url, header=None, names=names)
  • 我认为this Q/A,只有我的列表叫names,所以这里分配names=colnames names=names

标签: python python-3.x pandas dataframe


【解决方案1】:

可以将文件的url传递给read_csv,因为这里.data是csv格式,但是没有header,所以加了header=None

#if want see all data
pd.options.display.max_columns = None

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/arrhythmia/arrhythmia.data'
df = pd.read_csv(url, header=None)
print (df.head())

  0    1    2    3    4    5    6    7    8    9   10   11  12  13  14   15   \
0   75    0  190   80   91  193  371  174  121  -16  13   64  -2   ?  63    0   
1   56    1  165   64   81  174  401  149   39   25  37  -17  31   ?  53    0   
2   54    0  172   95  138  163  386  185  102   96  34   70  66  23  75    0   
3   55    0  175   94  100  202  380  179  143   28  11   -5  20   ?  71    0   
4   75    0  190   80   88  181  360  177  103  -16  13   61   3   ?   ?    0   

   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   \
0   52   44    0    0   32    0    0    0    0    0    0    0   44   20   36   
1   48    0    0    0   24    0    0    0    0    0    0    0   64    0    0   
2   40   80    0    0   24    0    0    0    0    0    0   20   56   52    0   
3   72   20    0    0   48    0    0    0    0    0    0    0   64   36    0   
4   48   40    0    0   28    0    0    0    0    0    0    0   40   24    0   
...
...
...

如果还想将? 转换为缺失值NaNs 添加na_values='?' 参数:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/arrhythmia/arrhythmia.data'
df = pd.read_csv(url, header=None, na_values='?')
print (df.head())

   0    1    2    3    4    5    6    7    8    9     10    11    12    13   \
0   75    0  190   80   91  193  371  174  121  -16  13.0  64.0  -2.0   NaN   
1   56    1  165   64   81  174  401  149   39   25  37.0 -17.0  31.0   NaN   
2   54    0  172   95  138  163  386  185  102   96  34.0  70.0  66.0  23.0   
3   55    0  175   94  100  202  380  179  143   28  11.0  -5.0  20.0   NaN   
4   75    0  190   80   88  181  360  177  103  -16  13.0  61.0   3.0   NaN   

    14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   \
0  63.0    0   52   44    0    0   32    0    0    0    0    0    0    0   44   
1  53.0    0   48    0    0    0   24    0    0    0    0    0    0    0   64   
2  75.0    0   40   80    0    0   24    0    0    0    0    0    0   20   56   
3  71.0    0   72   20    0    0   48    0    0    0    0    0    0    0   64   
4   NaN    0   48   40    0    0   28    0    0    0    0    0    0    0   40  
...
...

【讨论】:

  • 这是正确的答案。这是我即将在我的答案中写的补充。 “.data 可以是任何格式。文件扩展名并不决定文件的格式。我在记事本中打开文件,注意到其中的值是逗号分隔的。pandas 中有一个内置的阅读器功能负责加载逗号分隔的文件,pd.read_csv"
  • 并且没有列名?我认为他们在 arrhythmia.names 中。是否可以将它们添加为列名?
  • @french_fries - 是否可以通过列表定义列名?
【解决方案2】:

StringIO 这样做:

from io import StringIO
import pandas as pd
with open("arrhythmia.data", "r") as f:
    data = StringIO(f.read())
    arryth_df = pd.read_csv(data)

【讨论】:

  • 并且没有列名?我认为他们在 arrhythmia.names 中。是否可以将它们添加为列名?
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 2012-10-27
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2013-12-31
  • 2020-09-29
相关资源
最近更新 更多