一直试图从现有的数据框架和系列中构建新的数据框架

时间:2015-08-20 11:16:34

标签: python loops pandas

我正在尝试编写一个执行以下操作的循环:

df_f.ix[0] = df_n.loc[0]
df_f.ix[1] = h[0]
df_f.ix[2] = df_n.loc[1]
df_f.ix[3] = h[1]
df_f.ix[4] = df_n.loc[2]    
df_f.ix[5] = h[2]
...
df_f.ix[94778] = df_n.loc[47389]
df_f.ix[94779] = h[47389]

基本上,数据帧df_f的第1行(和所有行递增2)等于df_f的数据帧df_n的第1行(其行增加1)和第2行(以及行增加2)等于系列h的第1行(并且其行增加1)。等等......有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您不一定需要循环...您可以从现有数据框/系列创建新的数据列表,然后将其作为新的DataFrame

import pandas as pd

#example data
df_n = pd.DataFrame([1,2, 3, 4,5])
h = pd.Series([99, 98, 97, 96, 95])

new_data = [None] * (len(df_n) * 2)
new_data[::2] = df_n.loc[:, 0].values
new_data[1::2] = h.values
new_df = pd.DataFrame(new_data)

In [135]: new_df
Out[135]: 
    0
0   1
1  99
2   2
3  98
4   3
5  97
6   4
7  96
8   5
9  95

如果你真的想要一个可以做到这一点的循环,你可以像这样创建一个空数据框:

other_df = pd.DataFrame([None] * (len(df_n) * 2))
y = 0
for x in xrange(len(df_n)):
    other_df.loc[y] = df_n.loc[x]
    y+=1
    other_df.loc[y] = h[x]
    y+=1

In [136]: other_df
Out[136]: 
    0
0   1
1  99
2   2
3  98
4   3
5  97
6   4
7  96
8   5
9  95

答案 1 :(得分:0)

这在Numpy很容易做到。您可以使用df.values从Pandas Dataframe中检索数据。

>>> import numpy as np
>>> import pandas as pd
>>> df_a, df_b = pd.DataFrame([1, 2, 3, 4]), pd.DataFrame([5, 6, 7, 8])
>>> df_a
   0
0  1
1  2
2  3
3  4
>>> df_b
   0
0  5
1  6
2  7
3  8
>>> np_a, np_b = df_a.values, df_b.values
>>> np_a
array([[1],
       [2],
       [3],
       [4]])
>>> np_b
array([[5],
       [6],
       [7],
       [8]])
>>> np_c = np.hstack((np_a, np_b))
>>> np_c
array([[1, 5],
       [2, 6],
       [3, 7],
       [4, 8]])
>>> np_c = np_c.flatten()
>>> np_c
array([1, 5, 2, 6, 3, 7, 4, 8])
>>> df_c = pd.DataFrame(np_c)
>>> df_c
   0
0  1
1  5
2  2
3  6
4  3
5  7
6  4
7  8

所有这一切都在一行中,给定df_a和df_b:

>>> df_c = pd.DataFrame(np.hstack((df_a.values, df_b.values)).flatten())
>>> df_c
   0
0  1
1  5
2  2
3  6
4  3
5  7
6  4
7  8

编辑: 如果您有多个列,这是一般情况,

>>> df_a = pd.DataFrame([[1, 2], [3, 4]])
>>> df_b = pd.DataFrame([[5, 6], [7, 8]])
>>> df_a
   0  1
0  1  2
1  3  4
>>> df_b
   0  1
0  5  6
1  7  8
>>> np_a = df_a.values
>>> np_a = np_a.reshape(np_a.shape[0], 1, np_a.shape[1])
>>> np_a
array([[[1, 2]],

       [[3, 4]]])
>>> np_b = df_b.values
>>> np_b = np_b.reshape(np_b.shape[0], 1, np_b.shape[1])
>>> np_b
array([[[5, 6]],

       [[7, 8]]])
>>> np_c = np.concatenate((np_a, np_b), axis=1)
>>> np_c
array([[[1, 2],
        [5, 6]],

       [[3, 4],
        [7, 8]]])
>>> np_c = np_c.reshape(np_c.shape[0] * np_c.shape[2], np_c.shape[1])
>>> np_c
array([[1, 2],
       [5, 6],
       [3, 4],
       [7, 8]])
>>> df_c = pd.DataFrame(np_c)