Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一个较大的数据帧创建唯一命名的数据帧_Python_R_Pandas_Dataframe - Fatal编程技术网

Python 从一个较大的数据帧创建唯一命名的数据帧

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

对于使用数据帧和循环,这是一个全新的概念。在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       |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))
提供一个可复制的数据集?我现在已将此信息添加到问题中。