将元组列表转换为pandas数据框
我有一个包含元组的列表(y),我想把它转换成一个数据框(x)。这个列表y里有五个元组,每个元组都有33个元素。所有五个元组的第一个元素都是相同的文本,第二个元素也是相同的文本,第三个元素同样是相同的文本。
我希望y中的前三个元素能成为数据框的列名。我想把这个元组列表转换成一个10行3列的数据框。比较复杂的是,数据框的第一行应该是y[1]中的第4、5、6个元素,第二行是第7、8、9个元素,第三行是第10、11、12个元素,以此类推。
y的样子是这样的(没有显示完整的列表):
List of tuples y
y[0] y[1] y[2] y[3] y[4]
Formula Formula Formula Formula Formula
Phase Phase Phase Phase Phase
Value Value Value Value Value
"a" "a" "a" "a" "a"
"nxxx" "nxxx" "nxxx" "nxxx" "nxxx"
3.2 3.7 22.4 18.2 9.7
"h45" "h45" "h45" "h45" "h45"
"cacpp" "cacpp" "cacpp" "cacpp" "cacpp"
45.2 61.76 101.2 171.89 203.7
"trx" "trx" "trx" "trx" "trx"
"v2o5p" "v2o5p" "v2o5p" "v2o5p" "v2o5p"
0.24 0.81 0.97 1.2 1.98
"blnt" "blnt" "blnt" "blnt" "blnt"
"g2o3" "g2o3" "g2o3" "g2o3" "g2o3"
807.2 905.8 10089 10345 10979
我想把y转换成数据框x,格式如下:
DataFrame x
column 1 column 2 column 3
Formula Phase Value
"a" "nxxx" 3.2
"h45" "cacpp" 45.2
"trx" "v2o5p" 0.24
"blnt" "g2o3" 807.2
"a" "nxxx" 3.7
"h45" "cacpp" 61.76
"trx" "v2o5p" 0.81
"blnt" "g2o3" 905.8
"a" "nxxx" 22.4
"h45" "cacpp" 101.2
"trx" "v2o5p" 0.97
"blnt" "g2o3" 10089
etc etc etc
我知道一定有简单的方法可以遍历这个元组列表。但是我对Pandas还不太熟悉,对Python也相对较新,所以在寻找一个干净的解决方案时遇到了困难。
相关问题:
2 个回答
0
假设我们有一些虚拟数据:
In [122]: y1 = ('Formula', 'Phase', 'Value', 1, 2, 3, 4, 5, 6)
In [123]: y2 = ('Formula', 'Phase', 'Value', 7, 8, 9, 10, 11, 12)
In [124]: y = [y1, y2]
然后我们使用这个来自回答的“分组器”方法来按组进行迭代。
In [125]: from itertools import izip_longest
In [126]: def grouper(iterable, n, fillvalue=None):
...: args = [iter(iterable)] * n
...: return izip_longest(*args, fillvalue=fillvalue)
那么你可以这样做吗? grouper(y_tuple[3:], 3) 是在跳过前面3个元素后,以每3个为一组来遍历这个元组。
In [127]: columns = y[0][:3]
In [128]: data = []
...: for y_tuple in y:
...: for group_of_3 in grouper(y_tuple[3:], 3):
...: data.append(list(group_of_3))
...:
In [129]: data
Out[129]: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
In [130]: pd.DataFrame(data=data, columns=columns)
Out[130]:
Formula Phase Value
0 1 2 3
1 4 5 6
2 7 8 9
3 10 11 12
1
#Step 1) and 2) above.
In [83]: data = np.concatenate ([z[3:] for z in y])
#reshape
In [84]: data = data.reshape(-1, 3)
#Now data is a numpy array which looks what you need:
In [85]: data
Out[85]:
array([['a', 'nxxx', '3.2'],
['h45', 'cacpp', '45.2'],
['trx', 'v2o5p', '0.24'],
['blnt', 'g2o3', '807.2'],
['a', 'nxxx', '3.7'],
['h45', 'cacpp', '61.76'],
['trx', 'v2o5p', '0.81'],
['blnt', 'g2o3', '905.8'],
['a', 'nxxx', '22.4'],
['h45', 'cacpp', '101.2'],
['trx', 'v2o5p', '0.97'],
['blnt', 'g2o3', '10089'],
['a', 'nxxx', '18.2'],
['h45', 'cacpp', '171.89'],
['trx', 'v2o5p', '1.2'],
['blnt', 'g2o3', '10345'],
['a', 'nxxx', '9.7'],
['h45', 'cacpp', '203.7'],
['trx', 'v2o5p', '1.98'],
['blnt', 'g2o3', '10979']],
dtype='|S6')
In [86]: df = pd.DataFrame (data, columns=y[0][:3])
In [87]: df
Out[87]:
Formula Phase Value
0 a nxxx 3.2
1 h45 cacpp 45.2
2 trx v2o5p 0.24
3 blnt g2o3 807.2
4 a nxxx 3.7
5 h45 cacpp 61.76
6 trx v2o5p 0.81
7 blnt g2o3 905.8
8 a nxxx 22.4
9 h45 cacpp 101.2
10 trx v2o5p 0.97
11 blnt g2o3 10089
12 a nxxx 18.2
13 h45 cacpp 171.89
14 trx v2o5p 1.2
15 blnt g2o3 10345
16 a nxxx 9.7
17 h45 cacpp 203.7
18 trx v2o5p 1.98
19 blnt g2o3 10979
基本上,你需要做以下几件事:
- 去掉每个元组的前3个元素(只需要保留一个作为列标题)
- 把所有的
y中的元素连接起来 - 把数据
reshape成3列
这些操作都可以用 numpy 来完成,如果你在使用 pandas,那你应该对 numpy 也有一些了解。
你可以把 data 放进一个 pandas DataFrame 中。