Python Pandas:读取带有N列的csv,其中N在其他列中指定

时间:2017-01-04 21:12:27

标签: python pandas

假设我有一个具有以下标题的数据集:

<id>  <timestamp>  <N>  <1>  <2> ... <N>

在此数据集中,每一行都有一列&#34; N&#34;,这是一个数字,用于确定在其后用数字标记的列数。例如,我有一行如下:

5 142323151.14 800 5.3564 5.4534 ... 7.4839 (800 columns after the 3rd column)

保证所有行都具有相同的列数。

如何使用Pandas read_csv阅读此CSV文件并立即标记列?是否可以在一次通话中完成?我正在学习Pandas,所以我想知道Pandas如何完成一项需要多行Python代码的任务。

感谢您的帮助!

编辑: 我试过了

pd.read_csv('file.csv', names=['id','timestamp','count',...],
                        delimiter=' ',
                        header=None)

我不知道该放什么......部分

2 个答案:

答案 0 :(得分:4)

<强>更新

  

如果我有多个尾随列,例如   &LT 1为卤素; &LT 2 - ; ...,你如何在这里使用n的值?

In [320]: df
Out[320]:
   0             1   2   3   4   5   6   7   8   9   10    11    12
0   5  1.423232e+08   8   1   2   3   4   5   6   7   8  1000  1000
1   6  1.423236e+08   8  11  22  33  44  55  66  77  88  1000  1000

In [321]: ['id', 'timestamp', 'n'] + (df.columns[3:3+df.iat[0, 2]] - 2).tolist() + [11, 12]
Out[321]: ['id', 'timestamp', 'n', 1, 2, 3, 4, 5, 6, 7, 8, 11, 12]

In [322]: df.columns = ['id', 'timestamp', 'n'] + (df.columns[3:3+df.iat[0, 2]] - 2).tolist() + [11, 12]

In [323]: df
Out[323]:
   id     timestamp  n   1   2   3   4   5   6   7   8    11    12
0   5  1.423232e+08  8   1   2   3   4   5   6   7   8  1000  1000
1   6  1.423236e+08  8  11  22  33  44  55  66  77  88  1000  1000

如果您可以预定义尾随列名称,则可以执行以下操作:

In [328]: trailing_cols = ['max','min']

In [329]: ['id', 'timestamp', 'n'] + (df.columns[3:3+df.iat[0, 2]] - 2).tolist() + trailing_cols
Out[329]: ['id', 'timestamp', 'n', 1, 2, 3, 4, 5, 6, 7, 8, 'max', 'min']

OLD回答:

我这样做:

首先阅读您的CSV而不指定列名:

df = pd.read_csv('file.csv', delim_whitespace=True, header=None)

In [271]: df
Out[271]:
   0             1    2   3   4   5   6   7   8   9   10
0   5  1.423232e+08  800   1   2   3   4   5   6   7   8
1   5  1.423232e+08  800  11  22  33  44  55  66  77  88

现在我们可以按如下方式重命名列:

In [272]: df.columns = ['id', 'timestamp', 'n'] + (df.columns[3:].values - 2).tolist()

In [273]: df
Out[273]:
   id     timestamp    n   1   2   3   4   5   6   7   8
0   5  1.423232e+08  800   1   2   3   4   5   6   7   8
1   5  1.423232e+08  800  11  22  33  44  55  66  77  88

答案 1 :(得分:0)

您无需在read_csv中指定列数。你可以打电话

df = pd.read_csv('file.csv')

它应该读取(和行中的所有列)。如果你愿意,你可以传递header=0,但是大熊猫通常可以推断出这一点。