迭代以获取长度列表

时间:2019-10-28 12:48:32

标签: python pandas numpy

给出数据框line

data = [[10, 10, 10,10,10,10,10,10], [10, 10, 10,10,10,10,10,10], [10, 10, 10,10,10,10,10,10]]
line = pd.DataFrame(data, columns = ['0', '0.1','1', '1.1','2', '2.1','3', '3.1']) 
line

我到目前为止所做的:

border_1 = line[['2','2.1']]
border_1 = border_1.rename(columns={'2': 'longitude', '2.1': 'latitude'})
border_1 = border_1.dropna()

我是用[['2','2.1']]做的。现在,我想对每对夫妇从0 0.1 1 1.1开始,依此类推,以得到border_1


如何应用于整个数据框架?


cols = line.columns.tolist()
for i in range(0, len(cols), 2):
    border_1 = line[cols[i], cols[i+1]]
    border_1 = border_1.rename(columns={cols[i]: 'longitude', cols[i+i]: 'latitude'})
    border_1 = border_1.dropna()

KeyError: ('0', '0.1')

2 个答案:

答案 0 :(得分:0)

您有两个语法错误:

首先,要获取多个列,您需要将它们用作列表:

for i in range(0, len(cols), 2):
    border_1 = line[[cols[i], cols[i+1]]]

第二,一个简单的错字,但是cols[i+i]很快超出了范围。

    border_1 = border_1.rename(columns={cols[i]: 'longitude', cols[i+1]: 'latitude'})

答案 1 :(得分:0)

使用MultiIndex构建新的数据框

cols = (
    pd.MultiIndex.from_tuples([
        tuple(map(int, (x +  '.0').split('.')[:2]))
        for x in line.columns
    ]).set_levels(['longitude', 'latitude'], level=1)
)

border = pd.DataFrame({c: v for c, (k, v) in zip(cols, line.iteritems())})
border

          0                  1                  2                  3         
  longitude latitude longitude latitude longitude latitude longitude latitude
0        10       10        10       10        10       10        10       10
1        10       10        10       10        10       10        10       10
2        10       10        10       10        10       10        10       10