我有以下DataFrame
(df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
我通过分配添加更多列:
df['mean'] = df.mean(1)
如何将列mean
移到前面,即将其设置为第一列,保持其他列的顺序不变?
答案 0 :(得分:638)
一种简单的方法是使用列表重新分配数据框,根据需要重新排列。
这就是你现在所拥有的:
In [6]: df
Out[6]:
0 1 2 3 4 mean
0 0.445598 0.173835 0.343415 0.682252 0.582616 0.445543
1 0.881592 0.696942 0.702232 0.696724 0.373551 0.670208
2 0.662527 0.955193 0.131016 0.609548 0.804694 0.632596
3 0.260919 0.783467 0.593433 0.033426 0.512019 0.436653
4 0.131842 0.799367 0.182828 0.683330 0.019485 0.363371
5 0.498784 0.873495 0.383811 0.699289 0.480447 0.587165
6 0.388771 0.395757 0.745237 0.628406 0.784473 0.588529
7 0.147986 0.459451 0.310961 0.706435 0.100914 0.345149
8 0.394947 0.863494 0.585030 0.565944 0.356561 0.553195
9 0.689260 0.865243 0.136481 0.386582 0.730399 0.561593
In [7]: cols = df.columns.tolist()
In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']
以您想要的任何方式重新排列cols
。这就是我将最后一个元素移动到第一个位置的方式:
In [12]: cols = cols[-1:] + cols[:-1]
In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]
然后重新排序数据帧,如下所示:
In [16]: df = df[cols] # OR df = df.ix[:, cols]
In [17]: df
Out[17]:
mean 0 1 2 3 4
0 0.445543 0.445598 0.173835 0.343415 0.682252 0.582616
1 0.670208 0.881592 0.696942 0.702232 0.696724 0.373551
2 0.632596 0.662527 0.955193 0.131016 0.609548 0.804694
3 0.436653 0.260919 0.783467 0.593433 0.033426 0.512019
4 0.363371 0.131842 0.799367 0.182828 0.683330 0.019485
5 0.587165 0.498784 0.873495 0.383811 0.699289 0.480447
6 0.588529 0.388771 0.395757 0.745237 0.628406 0.784473
7 0.345149 0.147986 0.459451 0.310961 0.706435 0.100914
8 0.553195 0.394947 0.863494 0.585030 0.565944 0.356561
9 0.561593 0.689260 0.865243 0.136481 0.386582 0.730399
答案 1 :(得分:304)
您也可以这样做:
df = df[['mean', '0', '1', '2', '3']]
您可以通过以下方式获取列列表:
cols = list(df.columns.values)
输出将产生:
['0', '1', '2', '3', 'mean']
...然后在将其放入第一个函数
之前,可以手动重新排列答案 2 :(得分:256)
只需按照您想要的顺序分配列名称:
In [39]: df
Out[39]:
0 1 2 3 4 mean
0 0.172742 0.915661 0.043387 0.712833 0.190717 1
1 0.128186 0.424771 0.590779 0.771080 0.617472 1
2 0.125709 0.085894 0.989798 0.829491 0.155563 1
3 0.742578 0.104061 0.299708 0.616751 0.951802 1
4 0.721118 0.528156 0.421360 0.105886 0.322311 1
5 0.900878 0.082047 0.224656 0.195162 0.736652 1
6 0.897832 0.558108 0.318016 0.586563 0.507564 1
7 0.027178 0.375183 0.930248 0.921786 0.337060 1
8 0.763028 0.182905 0.931756 0.110675 0.423398 1
9 0.848996 0.310562 0.140873 0.304561 0.417808 1
In [40]: df = df[['mean', 4,3,2,1]]
现在,'意思是'专栏出现在前面:
In [41]: df
Out[41]:
mean 4 3 2 1
0 1 0.190717 0.712833 0.043387 0.915661
1 1 0.617472 0.771080 0.590779 0.424771
2 1 0.155563 0.829491 0.989798 0.085894
3 1 0.951802 0.616751 0.299708 0.104061
4 1 0.322311 0.105886 0.421360 0.528156
5 1 0.736652 0.195162 0.224656 0.082047
6 1 0.507564 0.586563 0.318016 0.558108
7 1 0.337060 0.921786 0.930248 0.375183
8 1 0.423398 0.110675 0.931756 0.182905
9 1 0.417808 0.304561 0.140873 0.310562
答案 3 :(得分:105)
怎么样:
df.insert(0, 'mean', df.mean(1))
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
答案 4 :(得分:64)
在你的情况下,
df = df.reindex_axis(['mean',0,1,2,3,4], axis=1)
将完全按照您的意愿行事。
在我的情况下(一般表格):
df = df.reindex_axis(sorted(df.columns), axis=1)
df = df.reindex_axis(['opened'] + list([a for a in df.columns if a != 'opened']), axis=1)
如果您想使用reindex
:
df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))
答案 5 :(得分:37)
最简单的方法
假设您有df
,其列为A
B
C
,
您可以df.reindex(['B','C','A'],axis=1)
答案 6 :(得分:29)
如果列名太长而无法键入,则可以通过以下位置的整数列表来指定新顺序:
数据:
0 1 2 3 4 mean
0 0.397312 0.361846 0.719802 0.575223 0.449205 0.500678
1 0.287256 0.522337 0.992154 0.584221 0.042739 0.485741
2 0.884812 0.464172 0.149296 0.167698 0.793634 0.491923
3 0.656891 0.500179 0.046006 0.862769 0.651065 0.543382
4 0.673702 0.223489 0.438760 0.468954 0.308509 0.422683
5 0.764020 0.093050 0.100932 0.572475 0.416471 0.389390
6 0.259181 0.248186 0.626101 0.556980 0.559413 0.449972
7 0.400591 0.075461 0.096072 0.308755 0.157078 0.207592
8 0.639745 0.368987 0.340573 0.997547 0.011892 0.471749
9 0.050582 0.714160 0.168839 0.899230 0.359690 0.438500
通用示例:
new_order = [3,2,1,4,5,0]
print(df[df.columns[new_order]])
3 2 1 4 mean 0
0 0.575223 0.719802 0.361846 0.449205 0.500678 0.397312
1 0.584221 0.992154 0.522337 0.042739 0.485741 0.287256
2 0.167698 0.149296 0.464172 0.793634 0.491923 0.884812
3 0.862769 0.046006 0.500179 0.651065 0.543382 0.656891
4 0.468954 0.438760 0.223489 0.308509 0.422683 0.673702
5 0.572475 0.100932 0.093050 0.416471 0.389390 0.764020
6 0.556980 0.626101 0.248186 0.559413 0.449972 0.259181
7 0.308755 0.096072 0.075461 0.157078 0.207592 0.400591
8 0.997547 0.340573 0.368987 0.011892 0.471749 0.639745
9 0.899230 0.168839 0.714160 0.359690 0.438500 0.050582
对于OP的特定情况:
new_order = [-1,0,1,2,3,4]
df = df[df.columns[new_order]]
print(df)
mean 0 1 2 3 4
0 0.500678 0.397312 0.361846 0.719802 0.575223 0.449205
1 0.485741 0.287256 0.522337 0.992154 0.584221 0.042739
2 0.491923 0.884812 0.464172 0.149296 0.167698 0.793634
3 0.543382 0.656891 0.500179 0.046006 0.862769 0.651065
4 0.422683 0.673702 0.223489 0.438760 0.468954 0.308509
5 0.389390 0.764020 0.093050 0.100932 0.572475 0.416471
6 0.449972 0.259181 0.248186 0.626101 0.556980 0.559413
7 0.207592 0.400591 0.075461 0.096072 0.308755 0.157078
8 0.471749 0.639745 0.368987 0.340573 0.997547 0.011892
9 0.438500 0.050582 0.714160 0.168839 0.899230 0.359690
这种方法的主要问题是多次调用相同的代码每次都会产生不同的结果,因此需要特别注意:)
答案 7 :(得分:24)
您需要按所需顺序创建列的新列表,然后使用df = df[cols]
重新排列此新订单中的列。
cols = ['mean'] + [col for col in df if col != 'mean']
df = df[cols]
您还可以使用更通用的方法。在此示例中,最后一列(由-1表示)作为第一列插入。
cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]
如果列存在于DataFrame中,您也可以使用此方法按所需顺序重新排序列。
inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df]
+ [col for col in df if col not in inserted cols])
df = df[cols]
答案 8 :(得分:16)
我自己也遇到了类似的问题,只想添加我所确定的内容。我喜欢reindex_axis() method
更改列顺序。这很有效:
df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)
基于@Jorge评论的另一种方法:
df = df.reindex(columns=['mean'] + list(df.columns[:-1]))
尽管reindex_axis
在微基准测试中似乎比reindex
略快一些,但我认为我更倾向于后者。
答案 9 :(得分:15)
简单地说,
df = df[['mean'] + df.columns[:-1].tolist()]
答案 10 :(得分:13)
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Controller.RegisterActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/messageToolBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/backArrow"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="left"
android:background="@drawable/ic_arrow_back_black_24dp"
tools:layout_editor_absoluteX="16dp"
tools:layout_editor_absoluteY="15dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:textSize="16sp"
android:text="Profile"
android:textColor="#424242" />
</androidx.appcompat.widget.Toolbar>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/userInfoConstraint"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
app:layout_constraintDimensionRatio="6:4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/messageToolBar">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/profileImageView"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginTop="36dp"
app:civ_border_color="#FFFFFF"
app:civ_border_width="2dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/nameTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="Name"
android:textColor="#424242"
android:textSize="@dimen/album_title"
app:layout_constraintEnd_toEndOf="@+id/profileImageView"
app:layout_constraintStart_toStartOf="@+id/profileImageView"
app:layout_constraintTop_toBottomOf="@+id/profileImageView" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="Yale"
android:textSize="@dimen/songs_count"
app:layout_constraintEnd_toEndOf="@+id/nameTv"
app:layout_constraintStart_toStartOf="@+id/nameTv"
app:layout_constraintTop_toBottomOf="@+id/nameTv" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
app:layout_constraintDimensionRatio="4:1"
app:layout_constraintEnd_toEndOf="@+id/userInfoConstraint"
app:layout_constraintStart_toStartOf="@+id/userInfoConstraint"
app:layout_constraintTop_toBottomOf="@+id/userInfoConstraint">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Empl ID"
android:textColor="#424242"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.051"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView7"
android:layout_width="64dp"
android:layout_height="16dp"
android:layout_marginTop="10dp"
android:text="2335795"
app:layout_constraintEnd_toEndOf="@+id/textView6"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/textView6"
app:layout_constraintTop_toBottomOf="@+id/textView6" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
app:layout_constraintDimensionRatio="6:4"
app:layout_constraintEnd_toEndOf="@+id/constraintLayout"
app:layout_constraintStart_toStartOf="@+id/constraintLayout"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Contact"
android:textColor="#424242"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.05"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/emailTv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toStartOf="@+id/imageView2"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/textView8"
app:layout_constraintTop_toBottomOf="@+id/textView8" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="24dp"
app:layout_constraintBottom_toBottomOf="@+id/emailTv"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/emailTv"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/pencil" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="333-333-1121"
app:layout_constraintEnd_toStartOf="@+id/imageView3"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/emailTv"
app:layout_constraintTop_toBottomOf="@+id/emailTv" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="24dp"
app:layout_constraintBottom_toBottomOf="@+id/textView3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/textView3"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/pencil" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
您可以尝试以下解决方案:
解决方案1:
import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names:
df[col] = np.random.randint(0,100, size=10000)
解决方案2:
df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]
解决方案3:
df = df[['mean', 'x', 'y', 'z']]
解决方案4:
col = df.pop("mean")
df = df.insert(0, col.name, col)
解决方案5:
df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)
解决方案6:
cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]
解决方案1:
CPU时间:用户1.05 ms,sys:35 µs,总计:1.08 ms挂墙时间:995 µs
解决方案2 :
CPU时间:用户933 µs,sys:0 ns,总计:933 µs 墙壁时间:800 µs
解决方案3 :
CPU时间:用户0 ns,sys:1.35 ms,总计:1.35 ms 挂墙时间:1.08毫秒
解决方案4 :
CPU时间:用户1.23 ms,sys:45 µs,总计:1.27 ms 壁挂时间:986 µs
解决方案5 :
CPU时间:用户1.09 ms,sys:19 µs,总计:1.11 ms 壁挂时间:949 µs
解决方案6 :
CPU时间:用户955 µs,sys:34 µs,总计:989 µs 墙时间:859 µs
答案 11 :(得分:13)
此功能可以避免您必须列出数据集中的每个变量,只是为了订购其中的一些变量。
def order(frame,var):
if type(var) is str:
var = [var] #let the command take a string or list
varlist =[w for w in frame.columns if w not in var]
frame = frame[var+varlist]
return frame
它需要两个参数,第一个是数据集,第二个是数据集中要带到前面的列。
所以在我的情况下,我有一个名为Frame的数据集,包含变量A1,A2,B1,B2,Total和Date。如果我想将道达尔带到前线,那么我所要做的就是:
frame = order(frame,['Total'])
如果我想将Total和Date带到前面,那么我会这样做:
frame = order(frame,['Total','Date'])
编辑:
使用它的另一个有用的方法是,如果你有一个不熟悉的表,并且你正在查看其中包含特定术语的变量,例如VAR1,VAR2,......你可以执行以下操作:
frame = order(frame,[v for v in frame.columns if "VAR" in v])
答案 12 :(得分:8)
您可以执行以下操作(借用Aman的答案):
cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))
cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]
df = df[cols]
答案 13 :(得分:8)
您可以使用以下名称列表重新排序数据框列:
df = df.filter(list_of_col_names)
答案 14 :(得分:7)
只需键入要更改的列名称,然后设置新位置的索引。
def change_column_order(df, col_name, index):
cols = df.columns.tolist()
cols.remove(col_name)
cols.insert(index, col_name)
return df[cols]
对于您的情况,这将是:
df = change_column_order(df, 'mean', 0)
答案 15 :(得分:7)
将任何列移动到任何位置:
import pandas as pd
df = pd.DataFrame({"A": [1,2,3],
"B": [2,4,8],
"C": [5,5,5]})
cols = df.columns.tolist()
column_to_move = "C"
new_position = 1
cols.insert(new_position, cols.pop(cols.index(column_to_move)))
df = df[cols]
答案 16 :(得分:6)
您可以使用一个集合,该集合是唯一元素的无序集合 ,以确保“其他列的顺序保持不变”:
<input
type="radio"
id={choice.option}
className="form-check-input"
name={`answers[${index}].answer`}
value={choice.option}
checked={
values.answers && values.answers[index]
? values.answers[index].answer === choice.option
: false
}
onChange={handleChange}
onBlur={handleBlur}
/>;
然后,您可以使用lambda通过以下方式将特定的列移至最前面:
other_columns = list(set(df.columns).difference(["mean"])) #[0, 1, 2, 3, 4]
答案 17 :(得分:6)
最简单的方法是更改列名的顺序,如
df = df[['mean', Col1,Col2,Col3]]
答案 18 :(得分:5)
按如下所示将“ n”列添加到df中后即可。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
df['mean'] = df.mean(1)
df
0 1 2 3 4 mean
0 0.929616 0.316376 0.183919 0.204560 0.567725 0.440439
1 0.595545 0.964515 0.653177 0.748907 0.653570 0.723143
2 0.747715 0.961307 0.008388 0.106444 0.298704 0.424512
3 0.656411 0.809813 0.872176 0.964648 0.723685 0.805347
4 0.642475 0.717454 0.467599 0.325585 0.439645 0.518551
5 0.729689 0.994015 0.676874 0.790823 0.170914 0.672463
6 0.026849 0.800370 0.903723 0.024676 0.491747 0.449473
7 0.526255 0.596366 0.051958 0.895090 0.728266 0.559587
8 0.818350 0.500223 0.810189 0.095969 0.218950 0.488736
9 0.258719 0.468106 0.459373 0.709510 0.178053 0.414752
### here you can add below line and it should work
# Don't forget the two (()) 'brackets' around columns names.Otherwise, it'll give you an error.
df = df[list(('mean',0, 1, 2,3,4))]
df
mean 0 1 2 3 4
0 0.440439 0.929616 0.316376 0.183919 0.204560 0.567725
1 0.723143 0.595545 0.964515 0.653177 0.748907 0.653570
2 0.424512 0.747715 0.961307 0.008388 0.106444 0.298704
3 0.805347 0.656411 0.809813 0.872176 0.964648 0.723685
4 0.518551 0.642475 0.717454 0.467599 0.325585 0.439645
5 0.672463 0.729689 0.994015 0.676874 0.790823 0.170914
6 0.449473 0.026849 0.800370 0.903723 0.024676 0.491747
7 0.559587 0.526255 0.596366 0.051958 0.895090 0.728266
8 0.488736 0.818350 0.500223 0.810189 0.095969 0.218950
9 0.414752 0.258719 0.468106 0.459373 0.709510 0.178053
答案 19 :(得分:5)
只是翻转经常会有所帮助。
Start (y)?
y
Start (y)?
Tick 0
Tick 1
Tick 2
Tick 3
n
Start (y)?
y
Start (y)?
Tick 0
Tick 1
或者只是随机播放一下。
cur.execute('''CREATE TABLE IF NOT EXISTS artist(id int PRIMARY KEY NOT NULL AUTO_INCREMENT, full_name varchar,
FOREIGN KEY (id) REFERENCES song(artist_id))''')
cur.execute('''CREATE TABLE IF NOT EXISTS Song(id int PRIMARY KEY NOT NULL AUTO_INCREMENT, name varchar,
artist_id int, entry_date timestamp, entry_position int)''')
答案 20 :(得分:5)
这个问题已经回答before但现在不推荐使用reindex_axis所以我建议使用:
df.reindex(sorted(df.columns), axis=1)
答案 21 :(得分:4)
<强> set()
强>
一种简单的方法是使用 set()
,特别是当您有一长串列并且不想手动处理它们时:
cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]
答案 22 :(得分:4)
这是一种移动现有列的方法,该列将修改现有数据框。
my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)
答案 23 :(得分:4)
我认为这是一个稍微整洁的解决方案:
df.insert(0,'mean', df.pop("mean"))
此解决方案与@JoeHeffer的解决方案有些相似,但这只是一个衬里。
在这里,我们从数据框中删除列"mean"
,并将其附加到具有相同列名的索引0
。
答案 24 :(得分:3)
我按照Wes McKinney的建议尝试了insert()
功能。
df.insert(0,&#39;表示&#39;,df.mean(1))
这得到了Timmie在一行中想要的结果,而不需要移动最后一列。
答案 25 :(得分:3)
如何使用&#34; T&#34;?
df.T.reindex(['mean',0,1,2,3,4]).T
答案 26 :(得分:2)
您可以使用可用于两个轴的reindex
:
df
# 0 1 2 3 4 mean
# 0 0.943825 0.202490 0.071908 0.452985 0.678397 0.469921
# 1 0.745569 0.103029 0.268984 0.663710 0.037813 0.363821
# 2 0.693016 0.621525 0.031589 0.956703 0.118434 0.484254
# 3 0.284922 0.527293 0.791596 0.243768 0.629102 0.495336
# 4 0.354870 0.113014 0.326395 0.656415 0.172445 0.324628
# 5 0.815584 0.532382 0.195437 0.829670 0.019001 0.478415
# 6 0.944587 0.068690 0.811771 0.006846 0.698785 0.506136
# 7 0.595077 0.437571 0.023520 0.772187 0.862554 0.538182
# 8 0.700771 0.413958 0.097996 0.355228 0.656919 0.444974
# 9 0.263138 0.906283 0.121386 0.624336 0.859904 0.555009
df.reindex(['mean', *range(5)], axis=1)
# mean 0 1 2 3 4
# 0 0.469921 0.943825 0.202490 0.071908 0.452985 0.678397
# 1 0.363821 0.745569 0.103029 0.268984 0.663710 0.037813
# 2 0.484254 0.693016 0.621525 0.031589 0.956703 0.118434
# 3 0.495336 0.284922 0.527293 0.791596 0.243768 0.629102
# 4 0.324628 0.354870 0.113014 0.326395 0.656415 0.172445
# 5 0.478415 0.815584 0.532382 0.195437 0.829670 0.019001
# 6 0.506136 0.944587 0.068690 0.811771 0.006846 0.698785
# 7 0.538182 0.595077 0.437571 0.023520 0.772187 0.862554
# 8 0.444974 0.700771 0.413958 0.097996 0.355228 0.656919
# 9 0.555009 0.263138 0.906283 0.121386 0.624336 0.859904
答案 27 :(得分:2)
这是为任意数量的列执行此操作的函数。
def mean_first(df):
ncols = df.shape[1] # Get the number of columns
index = list(range(ncols)) # Create an index to reorder the columns
index.insert(0,ncols) # This puts the last column at the front
return(df.assign(mean=df.mean(1)).iloc[:,index]) # new df with last column (mean) first
答案 28 :(得分:2)
@clocker:您的解决方案对我非常有帮助,因为我想从数据框中带来两列,我不知道所有列的名称,因为它们之前是通过pivot语句生成的。 所以,如果你处于相同的情况:要在前面列出你知道名字的列,然后让它们跟随“所有其他列”,我想出了以下一般解决方案;
df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)
答案 29 :(得分:1)
书中最荒谬的方法
df.insert(0,"test",df["mean"])
df=df.drop(columns=["mean"]).rename(columns={"test":"mean"})
答案 30 :(得分:1)
我认为此功能更简单。您只需要在开头或结尾或同时在两者处指定一列子集即可:
def reorder_df_columns(df, start=None, end=None):
"""
This function reorder columns of a DataFrame.
It takes columns given in the list `start` and move them to the left.
Its also takes columns in `end` and move them to the right.
"""
if start is None:
start = []
if end is None:
end = []
assert isinstance(start, list) and isinstance(end, list)
cols = list(df.columns)
for c in start:
if c not in cols:
start.remove(c)
for c in end:
if c not in cols or c in start:
end.remove(c)
for c in start + end:
cols.remove(c)
cols = start + cols + end
return df[cols]
答案 31 :(得分:1)
我喜欢Shoresh's answer使用设置功能在您不知道位置时删除列,但这并不适用于我的目的,因为我需要保留原始列顺序(有任意列标签)。
我通过使用boltons包中的IndexedSet来实现这一点。
我还需要重新添加多个列标签,因此对于更一般的情况,我使用了以下代码:
from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]
希望这对于搜索此线程以获得一般解决方案的任何人都有用。
答案 32 :(得分:1)
DataFrame.sort_index(axis=1)
很干净。Check doc here。
然后concat
答案 33 :(得分:1)
与最上面的答案类似,还有一种使用 deque() 及其 rotate() 方法的替代方法。 rotate 方法获取列表中的最后一个元素并将其插入到开头:
from collections import deque
columns = deque(df.columns.tolist())
columns.rotate()
df = df[columns]
答案 34 :(得分:1)
如果您知道其他列的位置,我相信@Aman's answer是最好的。
如果您不知道mean
的位置,但只知道其名称,则无法直接使用cols = cols[-1:] + cols[:-1]
。以下是我能提出的下一个最好的事情:
meanDf = pd.DataFrame(df.pop('mean'))
# now df doesn't contain "mean" anymore. Order of join will move it to left or right:
meanDf.join(df) # has mean as first column
df.join(meanDf) # has mean as last column
答案 35 :(得分:1)
我尝试制作一个订单功能,您可以参考Stata的订单命令重新排序/移动列。最好是制作一个py文件(名字可以是order.py),保存在一个目录下,调用函数
def order(dataframe,cols,f_or_l=None,before=None, after=None):
#만든이: 김완석, Stata로 뚝딱뚝딱 저자, blog.naver.com/sanzo213 운영
# 갖다 쓰시거나 수정을 하셔도 되지만 출처는 꼭 밝혀주세요
# cols옵션 및 befor/after옵션에 튜플이 가능하게끔 수정했으며, 오류문구 수정함(2021.07.12,1)
# 칼럼이 멀티인덱스인 상태에서 reset_index()메소드 사용했을 시 적용안되는 걸 수정함(2021.07.12,2)
import pandas as pd
if (type(cols)==str) or (type(cols)==int) or (type(cols)==float) or (type(cols)==bool) or type(cols)==tuple:
cols=[cols]
dd=list(dataframe.columns)
for i in cols:
i
dd.remove(i) #cols요소를 제거함
if (f_or_l==None) & ((before==None) & (after==None)):
print('f_or_l옵션을 쓰시거나 아니면 before옵션/after옵션 쓰셔야되요')
if ((f_or_l=='first') or (f_or_l=='last')) & ~((before==None) & (after==None)):
print('f_or_l옵션 사용시 before after 옵션 사용불가입니다.')
if (f_or_l=='first') & (before==None) & (after==None):
new_order=cols+dd
dataframe=dataframe[new_order]
return dataframe
if (f_or_l=='last') & (before==None) & (after==None):
new_order=dd+cols
dataframe=dataframe[new_order]
return dataframe
if (before!=None) & (after!=None):
print('before옵션 after옵션 둘다 쓸 수 없습니다.')
if (before!=None) & (after==None) & (f_or_l==None):
if not((type(before)==str) or (type(before)==int) or (type(before)==float) or
(type(before)==bool) or ((type(before)!=list)) or
((type(before)==tuple))):
print('before옵션은 칼럼 하나만 입력가능하며 리스트 형태로도 입력하지 마세요.')
else:
b=dd[:dd.index(before)]
a=dd[dd.index(before):]
new_order=b+cols+a
dataframe=dataframe[new_order]
return dataframe
if (after!=None) & (before==None) & (f_or_l==None):
if not((type(after)==str) or (type(after)==int) or (type(after)==float) or
(type(after)==bool) or ((type(after)!=list)) or
((type(after)==tuple))):
print('after옵션은 칼럼 하나만 입력가능하며 리스트 형태로도 입력하지 마세요.')
else:
b=dd[:dd.index(after)+1]
a=dd[dd.index(after)+1:]
new_order=b+cols+a
dataframe=dataframe[new_order]
return dataframe
下面的python代码是我制作的订单功能示例。我希望您可以使用我的订单功能轻松地对列重新排序:)
# module
import pandas as pd
import numpy as np
from order import order # call order function from order.py file
# make a dataset
columns='a b c d e f g h i j k'.split()
dic={}
n=-1
for i in columns:
n+=1
dic[i]=list(range(1+n,10+1+n))
data=pd.DataFrame(dic)
print(data)
# use order function (1) : order column e in the first
data2=order(data,'e',f_or_l='first')
print(data2)
# use order function (2): order column e in the last , "data" dataframe
print(order(data,'e',f_or_l='last'))
# use order function (3) : order column i before column c in "data" dataframe
print(order(data,'i',before='c'))
# use order function (4) : order column g after column b in "data" dataframe
print(order(data,'g',after='b'))
# use order function (4) : order columns ['c', 'd', 'e'] after column i in "data" dataframe
print(order(data,['c', 'd', 'e'],after='i'))
答案 36 :(得分:0)
大多数答案不够概括,pandas reindex_axis方法有点乏味,因此我提供了一个简单的函数,可使用字典将任意数量的列移动到任意位置,其中键=列名,值=移动位置至。如果您的数据框很大,则将True传递给'big_data',则该函数将返回有序列列表。您可以使用此列表对数据进行切片。
def order_column(df, columns, big_data = False):
"""Re-Orders dataFrame column(s)
Parameters :
df -- dataframe
columns -- a dictionary:
key = current column position/index or column name
value = position to move it to
big_data -- boolean
True = returns only the ordered columns as a list
the user user can then slice the data using this
ordered column
False = default - return a copy of the dataframe
"""
ordered_col = df.columns.tolist()
for key, value in columns.items():
ordered_col.remove(key)
ordered_col.insert(value, key)
if big_data:
return ordered_col
return df[ordered_col]
# e.g.
df = pd.DataFrame({'chicken wings': np.random.rand(10, 1).flatten(), 'taco': np.random.rand(10,1).flatten(),
'coffee': np.random.rand(10, 1).flatten()})
df['mean'] = df.mean(1)
df = order_column(df, {'mean': 0, 'coffee':1 })
>>>
col = order_column(df, {'mean': 0, 'coffee':1 }, True)
col
>>>
['mean', 'coffee', 'chicken wings', 'taco']
# you could grab it by doing this
df = df[col]
答案 37 :(得分:0)
我有一个非常特殊的用例,用于对熊猫中的列名进行重新排序。有时我会在基于现有列的数据框中创建一个新列。默认情况下,pandas将在最后插入我的新列,但我希望将新列插入到其派生的现有列的旁边。
#{'~"calc(90vh - 1.5em)"'}
答案 38 :(得分:0)
要根据现有名称的右/左设置现有列:
def df_move_column(df, col_to_move, col_left_of_destiny="", right_of_col_bool=True):
cols = list(df.columns.values)
index_max = len(cols) - 1
if not right_of_col_bool:
# set left of a column "c", is like putting right of column previous to "c"
# ... except if left of 1st column, then recursive call to set rest right to it
aux = cols.index(col_left_of_destiny)
if not aux:
for g in [x for x in cols[::-1] if x != col_to_move]:
df = df_move_column(
df,
col_to_move=g,
col_left_of_destiny=col_to_move
)
return df
col_left_of_destiny = cols[aux - 1]
index_old = cols.index(col_to_move)
index_new = 0
if len(col_left_of_destiny):
index_new = cols.index(col_left_of_destiny) + 1
if index_old == index_new:
return df
if index_new < index_old:
index_new = np.min([index_new, index_max])
cols = (
cols[:index_new]
+ [cols[index_old]]
+ cols[index_new:index_old]
+ cols[index_old + 1 :]
)
else:
cols = (
cols[:index_old]
+ cols[index_old + 1 : index_new]
+ [cols[index_old]]
+ cols[index_new:]
)
df = df[cols]
return df
例如
cols = list("ABCD")
df2 = pd.DataFrame(np.arange(4)[np.newaxis, :], columns=cols)
for k in cols:
print(30 * "-")
for g in [x for x in cols if x != k]:
df_new = df_move_column(df2, k, g)
print(f"{k} after {g}: {df_new.columns.values}")
for k in cols:
print(30 * "-")
for g in [x for x in cols if x != k]:
df_new = df_move_column(df2, k, g, right_of_col_bool=False)
print(f"{k} before {g}: {df_new.columns.values}")
输出:
答案 39 :(得分:0)
我想到的和 Dmitriy Work 一样,显然是最简单的答案:
df["mean"] = df.mean(1)
l = list(np.arange(0,len(df.columns) -1 ))
l.insert(0,-1)
df.iloc[:,l]