将Single Column(1,000行)拆分为两个较小的列(每个500行)



如何在pandas中将包含1000行的单列拆分为每列包含500行的两列块。

我有一个包含单列的csv文件,我需要将其拆分为多个列。以下是csv格式:

我走过的步骤:
我有多个csv文件,其中包含一列364行。我在将它们转换成数据帧后将它们连接起来,但它以线性方式复制文件。

代码I tried

monthly_list = []
for file in ['D0_monthly.csv','c1_monthly.csv','c2_monthly.csv','c2i_monthly.csv','c3i_monthly.csv','c4i_monthly.csv','D1_monthly.csv','D2i_monthly.csv','D3i_monthly.csv','D4i_monthly.csv',
'D2j_monthly.csv','D3j_monthly.csv','D4j_monthly.csv','c2j_monthly.csv','c3j_monthly.csv','c4j_monthly.csv']:
monthly_file = pd.read_csv(file,header=None,index_col=None,skiprows=[0])
monthly_list.append(monthly_file)
monthly_all_file = pd.concat(monthly_list)

数据如何:

tbody> <<tr>212
column1
1
3
364
3
364

答案更新为适用于任意列数

可以从列数或行长度开始。对于给定的初始列长度,可以在给定另一个列的情况下计算一个列。在这个答案中,我使用所需的目标列长度-tgt_row_len

nb_groups = 4
tgt_row_len = 5
df = pd.DataFrame({'column1': np.arange(1,tgt_row_len*nb_groups+1)})
print(df)
column1
0         1
1         2
2         3
3         4
4         5
5         6
6         7
...    
17       18
18       19
19       20

为以下分组操作在索引中创建组

df.index = df.reset_index(drop=True).index // tgt_row_len
column1
0        1
0        2
0        3
0        4
0        5
1        6
1        7
...
3       17
3       18
3       19
3       20
dfn = (
df.groupby(level=0).apply(lambda x: x['column1'].reset_index(drop=True)).T
.rename(columns = lambda x: 'col' + str(x+1)).rename_axis(None)
)
print(dfn)
col1  col2  col3  col4
0     1     6    11    16
1     2     7    12    17
2     3     8    13    18
3     4     9    14    19
4     5    10    15    20

处理创建两个列的上一个答案

这个答案只显示了10个目标行作为示例。这可以很容易地更改为364或500。

一个包含2组10行的数据帧

tgt_row_len = 10
df = pd.DataFrame({'column1': np.tile(np.arange(1,tgt_row_len+1),2)})
print(df)
column1
0         1
1         2
2         3
3         4
4         5
5         6
6         7
7         8
8         9
9        10
10        1
11        2
12        3
13        4
14        5
15        6
16        7
17        8
18        9
19       10

将底部行集移动到column2

df.assign(column2=df['column1'].shift(-tgt_row_len)).iloc[:tgt_row_len].astype(int)
column1  column2
0        1        1
1        2        2
2        3        3
3        4        4
4        5        5
5        6        6
6        7        7
7        8        8
8        9        9
9       10       10

我不知道是否有人有更有效的解决方案,但使用pd。在临时列上合并应该可以解决您的问题。以下是您可以编写的内容的快速实现。

csv1['temp'] = 1
csv2['temp'] = 1
new_df=pd.merge(csv1,csv2,on=["temp"])
new_df.drop("temp",axis=1)

我希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新