Python 使用pandas将新数据帧索引到新列中
我需要通过选择多个列,并将这些列值附加到一个新列,并将其相应的索引作为一个新列,从现有的数据框创建一个新的数据框 假设我将其作为数据帧:Python 使用pandas将新数据帧索引到新列中,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我需要通过选择多个列,并将这些列值附加到一个新列,并将其相应的索引作为一个新列,从现有的数据框创建一个新的数据框 假设我将其作为数据帧: A B C D E F 0 1 2 3 4 0 0 7 8 9 1 0 0 4 5 2 4 0 通过选择列B到列E将其转换为: A index_value 1 1 7 1 4 1 2 2 8 2 5 2 3 3 9 3 2 3 4 4 1 4 4 4 因此,对于新数据帧,列A将是旧数据帧中列B到E的所有值,列索引值将对应于所选列的索引值[从零开始] 我搔了
A B C D E F
0 1 2 3 4 0
0 7 8 9 1 0
0 4 5 2 4 0
通过选择列B到列E将其转换为:
A index_value
1 1
7 1
4 1
2 2
8 2
5 2
3 3
9 3
2 3
4 4
1 4
4 4
因此,对于新数据帧,列A
将是旧数据帧中列B到E的所有值,列索引值
将对应于所选列的索引值[从零开始]
我搔了好几个小时的头。任何帮助都将不胜感激,谢谢
Python3,使用pandas和numpy库。尝试使用:
df = pd.melt(df[['B', 'C', 'D', 'E']])
# Or df['variable'] = df[['B', 'C', 'D', 'E']].melt()
df['variable'].shift().eq(df['variable'].shift(-1)).cumsum().shift(-1).ffill()
print(df)
输出:
variable value
0 1.0 1
1 1.0 7
2 1.0 4
3 2.0 2
4 2.0 8
5 2.0 5
6 3.0 3
7 3.0 9
8 3.0 2
9 4.0 4
10 4.0 1
11 4.0 4
尝试使用:
df = pd.melt(df[['B', 'C', 'D', 'E']])
# Or df['variable'] = df[['B', 'C', 'D', 'E']].melt()
df['variable'].shift().eq(df['variable'].shift(-1)).cumsum().shift(-1).ffill()
print(df)
输出:
variable value
0 1.0 1
1 1.0 7
2 1.0 4
3 2.0 2
4 2.0 8
5 2.0 5
6 3.0 3
7 3.0 9
8 3.0 2
9 4.0 4
10 4.0 1
11 4.0 4
这只是melt
df.columns = range(df.shape[1])
s = df.melt().loc[lambda x : x.value!=0]
s
variable value
3 1 1
4 1 7
5 1 4
6 2 2
7 2 8
8 2 5
9 3 3
10 3 9
11 3 2
12 4 4
13 4 1
14 4 4
这只是melt
df.columns = range(df.shape[1])
s = df.melt().loc[lambda x : x.value!=0]
s
variable value
3 1 1
4 1 7
5 1 4
6 2 2
7 2 8
8 2 5
9 3 3
10 3 9
11 3 2
12 4 4
13 4 1
14 4 4
谢谢,这是一个愚蠢的问题,但是我可以使用df=pd.melt(df.iloc[:,[1,4])
作为选择列[1,2,3,4]的方法吗根据他们的索引?@TylerWayne是的,那也行得通。如果他们的答案有效,别忘了接受我或WenYoBen的答案。0,1.0 1,2.0 2,3.0 3,4.0 4,5.0 5,6.0 6,7.0 7,8.0 8,9.0
我相信可能没有正确选择专栏,会很快更新,愚蠢的问题,但我可以使用df=pd.melt(df.iloc[:,[1,4])
作为选择列[1,2,3,4]的方法根据他们的索引?@TylerWayne是的,也行得通。别忘了接受我或WenYoBen的答案,如果他们行得通的话,0,1.01,2.02,3.03,4.04,5.05,6.06,7.07,8.08,9.0
我相信可能没有正确选择这些列,会很快更新。我尝试过这个,显然我做不到df=df.loc[:,start\u column:end\u column].stack().sort_index(level=1)。reset_index(level=0,drop=True)。to_frame()
因为我正在尝试df.loc[:,9:15]
按索引选择列9,10,11,12,13,14,15
。我如何按索引选择列,并且仍能正常工作?在我的实际csv文件中,没有任何标题可供选择,因为它们都是整数。参考:类型错误:无法使用这些索引器对其进行切片索引[9]of
如果要使用数字索引,请尝试iloc[]而不是loc[],我在代码中使用了loc[],因为我是按名称引用列的。“B”而不是1。出于某种原因,索引值从3开始。我选择iloc[9:15],输出不应该从9开始,然后以数字形式增加到15?loc[a:B,c:d]表示选择行a到b和列c到d。loc[:,c:d]表示选择所有行和列c到d。我喜欢的是相同的,但基于索引。你想选择什么?所以,我尝试了这个,显然我做不到df=df.loc[:,start\u column:end\u column].stack()。排序\u索引(level=1)。重置\u索引(level=0,drop=True)。到\u frame()
因为我正在尝试df.loc[:,9:15]
按索引选择列9,10,11,12,13,14,15
。我如何按索引选择列,并且仍能正常工作?在我的实际csv文件中,没有任何标题可供选择,因为它们都是整数。参考:类型错误:无法使用这些索引器对其进行切片索引[9]of
如果要使用数字索引,请尝试iloc[]而不是loc[],我在代码中使用了loc[],因为我是按名称引用列的。“B”而不是1。出于某种原因,索引值从3开始。我选择iloc[9:15],输出不应该从9开始,然后以数字形式增加到15?loc[a:B,c:d]表示选择行a到b和列c到d。loc[:,c:d]表示选择所有行和列c到d。I love是相同的,但基于索引。您试图选择什么?