Python 创建以另一数据帧中的值命名的数据帧
我有一个包含三列的数据框,而col_1和col_2包含一些任意数据:Python 创建以另一数据帧中的值命名的数据帧,python,Python,我有一个包含三列的数据框,而col_1和col_2包含一些任意数据: data = {"Height": range(1, 20, 1), "Col_1": range(2, 40, 2), "Col_2": range(3, 60, 3)} df = pd.DataFrame(data) Height Col_1 Col_2 0 1 2 3 1 2 4
data = {"Height": range(1, 20, 1), "Col_1": range(2, 40, 2), "Col_2": range(3, 60, 3)}
df = pd.DataFrame(data)
Height Col_1 Col_2
0 1 2 3
1 2 4 6
2 3 6 9
3 4 8 12
4 5 10 15
5 6 12 18
6 7 14 21
7 8 16 24
8 9 18 27
9 10 20 30
10 11 22 33
11 12 24 36
12 13 26 39
13 14 28 42
14 15 30 45
15 16 32 48
16 17 34 51
17 18 36 54
18 19 38 57
以及另一个包含高度值的数据框,该数据框应用于从df中分割高度列
data_segments = {"Section Height" : [1, 10, 20]}
df_segments = pd.DataFrame(data_segments)
Section Height
0 1
1 10
2 20
我想创建两个新的数据帧,df_段_0包含初始df的所有列,但仅用于df_段中前两个索引内的高度行。df_段_1应采用相同的方法。它们应该看起来像:
df_segment_0
Height Col_1 Col_2
0 1 2 3
1 2 4 6
2 3 6 9
3 4 8 12
4 5 10 15
5 6 12 18
6 7 14 21
7 8 16 24
8 9 18 27
df_segment_1
Height Col_1 Col_2
9 10 20 30
10 11 22 33
11 12 24 36
12 13 26 39
13 14 28 42
14 15 30 45
15 16 32 48
16 17 34 51
17 18 36 54
18 19 38 57
我使用.loc方法尝试了以下代码,并添加了C Hecht创建数据帧列表的建议:
df_segment_list = []
try:
for index in df_segments.index:
df_segment = df[["Height", "Col_1", "Col_2"]].loc[(df["Height"] >= df_segments["Section Height"][index]) & (df["Height"] < df_segments["Section Height"][index + 1])]
df_segment_list.append(df_segment)
except KeyError:
pass
但是,我希望自动命名最终数据帧。我试过:
for i in range(0, len(df_segment_list)):
name = "df_segment_" + str(i)
name = df_segment_list[i]
我希望这段代码能够简单地自动化df_段_0=df_段_列表[0],相反,我收到一个错误名称“df_段_0”未定义
我需要单独数据帧的原因是,我将使用Col_1和Col_2执行许多后续操作,因此我需要对它们中的每一个进行行访问,例如:
df_segment_0 = df_segment_0 .assign(col_3 = df_segment_0 ["Col_1"] / df_segment_0 ["Col_2"])
我如何做到这一点
编辑1:用C Hecht的建议澄清问题。不幸的是,我不能100%理解您的想法,但我希望以下内容能帮助您找到答案: 作为pd进口熊猫 将numpy作为np导入 数据帧{'Section Height':[20,90,111,232,252,3383,3768,3826,3947,4100],'df_names':[f'df_Section_{i}表示范围10中的i]} df['shift']=df['Section Height'].shift-1 新的_dfs=[] 对于索引,df.iterrows中的行: 如果np.isnanrow['Shift']: 不知道你想在这里做什么 通过 其他: new_df=pd.DataFrame{'heights':[i在rangeintrow['Section heights']中表示i,introw['shifted']] new_df.name=行['df_name'] 新建_dfs.appendnew_df 新的_dfs的内容是如下所示的数据帧:
heights
0 20
1 21
2 22
3 23
4 24
.. ...
65 85
66 86
67 87
68 88
69 89
[70 rows x 1 columns]
如果你澄清了你的问题,我们会一直帮助你,但希望这能为你指明正确的方向
编辑:关于使用df.name的一个小注释:这不是很稳定,如果你做了诸如删除列、酸洗/取消酸洗等事情,名称可能会丢失。但是,您确实可以根据需要找到一个很好的解决方案来维护名称。如果您想在分段数据框中获取所有小于当前分段高度的条目,请执行以下操作: 作为pd进口熊猫 df1=pd.DataFrame{Height:range1,20,1,Col_1:range2,40,2,Col_2:range3,60,3} df_segments=pd.DataFrame{Section Height:[1,10,20]} def段数据帧数据帧:pd.DataFrame,段计划:pd.DataFrame: df=数据\u frame.copy制作安全拷贝,因为我们对df进行了变异!!! 对于分段平面图[截面高度]中的sh:sh是新的最大高度 df_new=df[df[Height]
如果要跟踪并命名各个帧,可以使用的确,我得到了一个数据帧列表,但它们没有正确分开,如我编辑的问题所示。此外,如果我尝试打印出例如df_section_7,则会报告相同的错误,即没有定义df_section_7。顺便说一句,我的问题哪一部分不清楚?print语句需要引用已定义的对象。您可以执行printnew_dfs[0]来创建第一个df。Python不知道df_section_7是什么,因为它不是一个对象。你说的正确分离是什么意思?请澄清提供预期结果的含义。那么,我将如何定义名为df_section_0到df_section_8的数据帧对象?我的初始代码中的错误似乎仍然存在,因为我设法将数据帧分割为段,但每个段都没有保存为数据帧对象,以后可以使用。希望这更有意义?每个数据帧都保存为列表new_dfs中的一个对象。您也可以通过将new_dfs=[]更改为new_dfs={}和new_dfs来制作dict。将new_df添加到new_dfs[row['df_names']]=new_df,允许您按名称调用它们:printnew_dfs['df_section_7']。我按照您建议的方式访问了创建的数据帧。但是,我想自动化整个过程,而无需单独命名每个段,因为在将来,seg的数量会增加 具体情况可能会有所不同。我更新了我的问题,以便更好地澄清问题。你知道我怎样才能做到这一点吗?
heights
0 20
1 21
2 22
3 23
4 24
.. ...
65 85
66 86
67 87
68 88
69 89
[70 rows x 1 columns]