我有一个我希望转换为DataFrame x的元组列表(y)。 y中有五个元组。 y中的每个元组都有33个元素。所有5个元组中的元素1都是文本,并且是相同的。所有五个元组中的元素二是文本并且是相同的。每个元组中的元素三是文本并且是相同的。
我希望y中的前三个元素成为DataFrame中的列名。我想将元组列表转换为10 x 3 DataFrame。棘手的部分是数据帧中的第1行是y [1]中的元素4,5,6,数据帧中的第2行是y [1]中的元素7,8,9,第3行是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转换为DataFrame 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来说相对较新,所以我正在努力用干净的方式来做这件事。
答案 0 :(得分:1)
基本上,你需要:
1)删除每个元组的前3个元素(只需要一个作为列标题)
2)concatenate
y
中的所有元素
3)reshape
到3列
所有这些都可以使用numpy
来实现,如果您使用pandas
#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')
您可以将data
放入pandas DataFrame
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
答案 1 :(得分: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]
使用这个'石斑鱼'此answer中的配方按组进行迭代。
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