【问题标题】:Split single row into multiple row based on no of sets in python根据python中的集合数将单行拆分为多行
【发布时间】:2021-03-05 20:44:45
【问题描述】:

我正在尝试将包含 15 个变量的记录拆分为 5 个记录集,其中第一条记录包含 3 个变量数据,其余 12 个变量为空值,第二条记录包含 6 个变量,其余 9 个变量为空值,第三条记录包含9 个变量,其余 6 个变量为空值。

每条记录都有相同的类变量。

我正在尝试找出一个 python 程序来对大约 149 条记录数据集执行此操作。

有人可以帮忙吗?

谢谢, 否

【问题讨论】:

  • 请分享一个带有预期输出的示例输入,以便更好地理解。
  • @MayankPorwal.. 添加图片以便更好地理解

标签: pandas numpy csv


【解决方案1】:

您可以使用广播进行屏蔽 - 这意味着将由np.arange 创建的数组按索引长度与使用列长度除以整数除以3 创建的数组进行三元组比较:

np.random.seed(2020)
df = (pd.DataFrame(np.random.rand(4, 15))
        .rename(columns=lambda x: f'V{x+1}')
        .assign(Class = [0,1,1,0]))
print (df)
         V1        V2        V3        V4  ...       V13       V14       V15  Class
0  0.986277  0.873392  0.509746  0.271836  ...  0.736325  0.355663  0.341093      0
1  0.666803  0.217101  0.561427  0.124179  ...  0.456119  0.155851  0.476049      1
2  0.169702  0.896258  0.373394  0.379693  ...  0.763921  0.919691  0.070573      1
3  0.156165  0.636894  0.555696  0.191929  ...  0.936032  0.803028  0.697305      0

[4 rows x 16 columns]

N = 15
new_rows = N // 3
df1 = df.iloc[:, :N]
mask = np.arange(new_rows)[:, None] >= np.arange(len(df1.columns)) // 3

repeated = np.tile(df1.to_numpy(), new_rows).reshape(new_rows * len(df.index), -1)
mask = np.tile(mask, (len(df1.index), 1))

arr = np.where(mask, repeated, np.nan)

df1 = (pd.DataFrame(arr, columns=df.columns[:N])
         .assign(Class = np.repeat(df['Class'].to_numpy(), new_rows)))

print (df1)

          V1        V2        V3        V4  ...       V13       V14       V15  Class
0   0.986277  0.873392  0.509746       NaN  ...       NaN       NaN       NaN      0
1   0.986277  0.873392  0.509746  0.271836  ...       NaN       NaN       NaN      0
2   0.986277  0.873392  0.509746  0.271836  ...       NaN       NaN       NaN      0
3   0.986277  0.873392  0.509746  0.271836  ...       NaN       NaN       NaN      0
4   0.986277  0.873392  0.509746  0.271836  ...  0.736325  0.355663  0.341093      0
5   0.666803  0.217101  0.561427       NaN  ...       NaN       NaN       NaN      1
6   0.666803  0.217101  0.561427  0.124179  ...       NaN       NaN       NaN      1
7   0.666803  0.217101  0.561427  0.124179  ...       NaN       NaN       NaN      1
8   0.666803  0.217101  0.561427  0.124179  ...       NaN       NaN       NaN      1
9   0.666803  0.217101  0.561427  0.124179  ...  0.456119  0.155851  0.476049      1
10  0.169702  0.896258  0.373394       NaN  ...       NaN       NaN       NaN      1
11  0.169702  0.896258  0.373394  0.379693  ...       NaN       NaN       NaN      1
12  0.169702  0.896258  0.373394  0.379693  ...       NaN       NaN       NaN      1
13  0.169702  0.896258  0.373394  0.379693  ...       NaN       NaN       NaN      1
14  0.169702  0.896258  0.373394  0.379693  ...  0.763921  0.919691  0.070573      1
15  0.156165  0.636894  0.555696       NaN  ...       NaN       NaN       NaN      0
16  0.156165  0.636894  0.555696  0.191929  ...       NaN       NaN       NaN      0
17  0.156165  0.636894  0.555696  0.191929  ...       NaN       NaN       NaN      0
18  0.156165  0.636894  0.555696  0.191929  ...       NaN       NaN       NaN      0
19  0.156165  0.636894  0.555696  0.191929  ...  0.936032  0.803028  0.697305      0

[20 rows x 16 columns]

【讨论】:

  • 感谢您的回答,但您的代码似乎仅适用于单条记录。我想将此概念应用于 df 的每条记录,其中包含 149 条唯一记录,每条记录 3 组用于拆分
  • @Naseer - 你现在可以测试了吗? N 是必要的按列数更改。
  • 看起来它正在按预期工作。感谢耶斯瑞尔的帮助。我使用了很多带有中断、混乱代码的 for 循环。再次感谢!
  • @Naseer - 当然,好主意。我尝试创建最通用的解决方案,所以添加 N - 只有必要的 N 可以被 3 整除,如 3,9,15, 99, 150 ... ;)
  • 你能建议吗,我可以在哪里更改代码以分配具有不同变量编号的集合。比如第一组包含 3 个,第二组包含 5 个,第三组包含 4 个,第四组包含 3 个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多