我正在尝试从此电子表格中提取信息(请参阅示例文件)。我有这样的多张床单。我需要记录事件(H,HI等)发生的名称和日期。我正在整理一个主数据集(类似于最终文件中所示)。列出每个日期以及姓名和字母代码(模态)。
我一直在尝试使用拆分功能。但它为我提供了无效的清单。
谢谢, 约旦
示例数据
Feb-15
NAME 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Name 1 H H H H H HI H H H H H H
Name 2 H H H H H H H H H H C H H H H H H
Name 3 H H H H H H H H H H H H H H H H H H H H H H H H
Name 4 H H H H H H H H H H H H H H H H H H H H
Name 5 H H H H H H H H H H H H
Name 6 HA HA HA HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI
Name 7 C
Name 8 C
Name 9 HA HA
Name 10 HI HI HI HI HI HI HI
期望的最终结果
name date modality
Name 1 2-Feb-15 H
Name 1 4-Feb-15 H
Name 1 6-Feb-15 H
Name 1 9-Feb-15 H
Name 1 11-Feb-15 H
Name 1 13-Feb-15 HI
Name 1 16-Feb-15 H
Name 1 18-Feb-15 H
Name 1 20-Feb-15 H
Name 1 23-Feb-15 H
Name 1 25-Feb-15 H
Name 1 27-Feb-15 H
Name 2 2-Feb-15 H
Name 2 4-Feb-15 H
Name 2 5-Feb-15 H
Name 2 7-Feb-15 H
Name 2 9-Feb-15 H
Name 2 10-Feb-15 H
Name 2 12-Feb-15 H
Name 2 14-Feb-15 H
Name 2 16-Feb-15 H
Name 2 17-Feb-15 H
Name 2 18-Feb-15 C
Name 2 19-Feb-15 H
Name 2 21-Feb-15 H
Name 2 23-Feb-15 H
Name 2 24-Feb-15 H
Name 2 26-Feb-15 H
Name 2 28-Feb-15 H
期望的结果只显示前2个名字和所有发生的日期,需要为所有人完成
答案 0 :(得分:3)
您正在寻找解决从wide form to long form转换数据的常见问题。这可以使用#[110000 rows x 3 columns]
df = pd.concat([df] * 10000, ignore_index=True)
In [364]: %%timeit
...: (df['A'] + '/' + df['B'] + '/' + df['C'] + '/X').values.tolist()
...:
60.2 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [365]: %%timeit
...: df.apply(lambda x: '/'.join(x), axis=1).add('/X').tolist()
...:
2.48 s ± 39.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [366]: %%timeit
...: list1, list2, list3 = df['A'].tolist(), df['B'].tolist(), df['C'].tolist()
...: for i in zip(list1, list2, list3):
...: val = map(str, i)
...: keylist.append('/'.join(val))
...: keylist[-1] += '/X'
...:
192 ms ± 78.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [367]: %%timeit
...: df.iloc[:,0].str.cat([df[c] for c in df.columns[1:]],sep='/').tolist()
...:
61.1 ms ± 540 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [368]: %%timeit
...: df.assign(New='X').apply('/'.join,1).tolist()
...:
2.51 s ± 76.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [369]: %%timeit
...: ['{0}/{1}/{2}/X'.format(i, j, k) for i, j, k in df.values.tolist()]
74.6 ms ± 2.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
包中的gather
函数(tidyverse的一部分)来完成。
以下是将其与您的数据一起使用的一种方法,以及来自tidyr
包的一些额外调用以帮助格式化它:
dplyr
运行后我们有:
library(dplyr)
library(tidyr)
df <- read.table(text="
NAME 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Name.1 NA H NA H NA H NA NA H NA H NA HI NA NA H NA H NA H NA NA H NA H NA H NA
Name.2 NA H NA H H NA H NA H H NA H NA H NA H H C H NA H NA H H NA H NA H
Name.3 NA H H H H H H NA H H H H H H NA H H H H H H NA H H H H H H
Name.4 NA H H H NA H H NA H H H NA H H NA H H H H NA H NA H H H NA H H
Name.5 NA NA H NA NA H H NA NA H NA H NA H NA NA H NA H NA H NA NA H NA H NA H
Name.6 NA NA NA HA HA HA HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI HI
Name.7 NA NA NA NA NA NA NA NA NA NA NA NA C NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Name.8 NA NA NA NA NA C NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Name.9 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA HA HA
Name.10 NA HI HI HI HI HI NA NA HI HI NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA", header = T)
mon.yr <- "Feb-15"
df <- gather(df, key = "date", value = "modality", 2:ncol(df)) %>%
filter(!is.na(modality)) %>%
mutate(date = sub('X(\\d+)', paste0('\\1-', mon.yr), date)) %>%
arrange(NAME)