简体   繁体   English

使用Pandas将新数据框索引到新列中

[英]Indexing new dataframes into new columns with pandas

I need to create a new dataframe from an existing one by selecting multiple columns, and appending those column values to a new column with it's corresponding index as a new column 我需要通过选择多个列,并通过将其对应的索引作为新列附加到新列中,从而从现有数据框中创建一个新数据框

So, lets say I have this as a dataframe: 因此,可以说我将其作为数据框:

A B C D E F
0 1 2 3 4 0
0 7 8 9 1 0
0 4 5 2 4 0

Transform into this by selecting columns B through E: 通过选择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

So, for the new dataframe, column A would be all of the values from columns B through E in the old dataframe, and column index_value would correspond to the index value [starting from zero] of the selected columns. 因此,对于新数据帧,列A将是旧数据帧中B through E列的所有值,而index_value列将对应于所选列的索引值[从零开始]。

I've been scratching my head for hours. 我已经挠头好几个小时了。 Any help would be appreciated, thanks! 任何帮助,将不胜感激,谢谢!

Python3, Using pandas & numpy libraries. Python3,使用pandas和numpy库。

Try using: 尝试使用:

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)

Output: 输出:

    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

This is just melt 这只是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
#Another way

    A   B   C   D   E   F
0   0   1   2   3   4   0
1   0   7   8   9   1   0
2   0   4   5   2   4   0

# Select columns to include

start_colum ='B'
end_column ='E'
index_column_name ='A'

#re-stack the dataframe

df = df.loc[:,start_colum:end_column].stack().sort_index(level=1).reset_index(level=0, drop=True).to_frame()

#Create the "index_value" column 

df['index_value'] =pd.Categorical(df.index).codes+1

df.rename(columns={0:index_column_name}, inplace=True)

df.set_index(index_column_name, inplace=True)

df

    index_value
A   
1   1
7   1
4   1
2   2
8   2
5   2
3   3
9   3
2   3
4   4
1   4
4   4

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM