Python 从一个较大的数据帧创建唯一命名的数据帧
对于使用数据帧和循环,这是一个全新的概念。在python或R中寻找我的查询的答案。我有一个结构与下面类似的数据框架Python 从一个较大的数据帧创建唯一命名的数据帧,python,r,pandas,dataframe,Python,R,Pandas,Dataframe,对于使用数据帧和循环,这是一个全新的概念。在python或R中寻找我的查询的答案。我有一个结构与下面类似的数据框架 TP1.v1 | TP1.v2 | TP1.v3 | TP2.v1 | TP2.v2 | TP2.v3 |... TPn.v1 Gene A| 7 |6 |7 |6 |4 |1 |... 9 Gene B| 3 |4 |4 |4 |5
TP1.v1 | TP1.v2 | TP1.v3 | TP2.v1 | TP2.v2 | TP2.v3 |... TPn.v1
Gene A| 7 |6 |7 |6 |4 |1 |... 9
Gene B| 3 |4 |4 |4 |5 |3 |... 3
Gene n| 6 |1 |1 |5 |7 |7 |... 8
我想为所有TP1、TP2等创建一个新的数据帧。每个TP(时间点)有3列与其关联。理想情况下,我也希望使用循环来实现这一点,因为我有多个具有类似结构的文件。最后,我希望循环为每个新数据帧提供一个新的唯一名称
我已经能够在R中完成这项任务,而不需要使用循环。简单地重复使用基本函数来操作数据帧。但这是相当缓慢和费力的,所以我想做一个循环
理想的输出是n个唯一命名的数据帧,每个数据帧有3列,每个数据帧保留原始数据帧的行名称和列名称
下面我添加了来自R的dput(头部(df))的输出
不确定唯一命名的数据帧是什么意思。这将创建一个包含每个数据帧的字典。希望能有帮助
import pandas as pd
import numpy as np
# Sample Data
df = pd.DataFrame(np.random.rand(50,3*10),
columns = ['TP%d.v%d'%(i, j) for i in range(1,11) for j in range(1,4)])
# Construct dictionary:
dd = {}
for name in df.columns.str.split('.').str[0].unique():
dd[name] = df[df.columns[df.columns.str.startswith(name)]].copy()
如果您想使用多索引数据帧。以下解决方案将简单地重新定义当前数据帧的列。处理这些问题可能有点复杂,但效率更高:
# MultiIndex Solution
df.columns = df.columns.str.split('.', expand=True)
不确定唯一命名的数据帧是什么意思。这将创建一个包含每个数据帧的字典。希望能有帮助
import pandas as pd
import numpy as np
# Sample Data
df = pd.DataFrame(np.random.rand(50,3*10),
columns = ['TP%d.v%d'%(i, j) for i in range(1,11) for j in range(1,4)])
# Construct dictionary:
dd = {}
for name in df.columns.str.split('.').str[0].unique():
dd[name] = df[df.columns[df.columns.str.startswith(name)]].copy()
如果您想使用多索引数据帧。以下解决方案将简单地重新定义当前数据帧的列。处理这些问题可能有点复杂,但效率更高:
# MultiIndex Solution
df.columns = df.columns.str.split('.', expand=True)
在
R
# assuming you know the prefix and how many time points you have (e.g. D and 5)
tp <- c(1, 3, 6, 10, 14)
prefix <- "D"
# for loop
for (i in tp) {
common <- paste0(prefix, i) # create common name e.g. D1, D3, D6 etc.
# assign columns to its unique df
assign(common, df[, grep(paste0(common, "\\."), colnames(df), ignore.case = T)])
}
# using lapply (could be a bit faster than for loop)
lapply(tp, function(i) {
common <- paste0(prefix, i) # create common name e.g. D1, D3, D6 etc.
# assign columns to its unique df
assign(common, df[, grep(paste0(common, "\\."), colnames(df), ignore.case = T)], envir = .GlobalEnv)
})
在
R
# assuming you know the prefix and how many time points you have (e.g. D and 5)
tp <- c(1, 3, 6, 10, 14)
prefix <- "D"
# for loop
for (i in tp) {
common <- paste0(prefix, i) # create common name e.g. D1, D3, D6 etc.
# assign columns to its unique df
assign(common, df[, grep(paste0(common, "\\."), colnames(df), ignore.case = T)])
}
# using lapply (could be a bit faster than for loop)
lapply(tp, function(i) {
common <- paste0(prefix, i) # create common name e.g. D1, D3, D6 etc.
# assign columns to its unique df
assign(common, df[, grep(paste0(common, "\\."), colnames(df), ignore.case = T)], envir = .GlobalEnv)
})
您是否可以使用
dput(head(df))
提供一个可复制的数据集?我现在已将此信息添加到问题中。您是否可以使用dput(head(df))
提供一个可复制的数据集?我现在已将此信息添加到问题中。