Python 使用pandas在数据帧中插入行

Python 使用pandas在数据帧中插入行,python,pandas,Python,Pandas,我创建了一个静态方法,为参与实验的参与者创建了一个随机培训协议。这种方法很有效,但我希望训练日总是从“直线滑翔”开始。有没有一个简单的方法可以在熊猫身上做到这一点 我曾尝试使用.loc,但结果是它覆盖了现有的值,而这不是我想要的 谢谢 基督教徒 @staticmethod def allokeringRandom(printToCSV=False): dn = [] for i in range(1, 4): df = pd

我创建了一个静态方法,为参与实验的参与者创建了一个随机培训协议。这种方法很有效,但我希望训练日总是从“直线滑翔”开始。有没有一个简单的方法可以在熊猫身上做到这一点

我曾尝试使用.loc,但结果是它覆盖了现有的值,而这不是我想要的

谢谢 基督教徒

    @staticmethod
    def allokeringRandom(printToCSV=False):
        dn = []
        for i in range(1, 4):
            df = pd.DataFrame()
            loype = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
            dn.append(random.sample(loype, len(loype)))
        df = pd.DataFrame(dn).transpose()
        df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
        if printToCSV == True:
            df.to_csv('test3.csv')

只需在调用
df.transpose()
后覆盖数据帧的第一行即可

df.iloc[0] = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','STRAIGHT-GLIDING']
然而,我建议用一种完全不同的方式构建数据框架。从字典开始,向其中添加随机值,然后将其转换为数据帧。我发现这种实现方式更容易阅读

loype = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
#start with 'STRAIGHT-GLIDING' for each training day
d = {
    "Treningsdag 1":['STRAIGHT-GLIDING'],
    "Treningsdag 2":['STRAIGHT-GLIDING'],
    "Treningsdag 3":['STRAIGHT-GLIDING'],
}
#add random exercises
for n in range(10):
    for k in d:
        d[k].append(*random.sample(loype, 1))
#make a DataFrame        
df = pd.DataFrame(d)

print(df)

       Treningsdag 1     Treningsdag 2     Treningsdag 3
0   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
1            LØYPE 3           LØYPE 2           LØYPE 2
2            LØYPE 3  STRAIGHT-GLIDING           LØYPE 3
3            LØYPE 2  STRAIGHT-GLIDING  STRAIGHT-GLIDING
4            LØYPE 2  STRAIGHT-GLIDING           LØYPE 3
5            LØYPE 3           LØYPE 3           LØYPE 3
6            LØYPE 2           LØYPE 3           LØYPE 2
7            LØYPE 3           LØYPE 3           LØYPE 3
8            LØYPE 2  STRAIGHT-GLIDING           LØYPE 2
9            LØYPE 3           LØYPE 1           LØYPE 2
10           LØYPE 2           LØYPE 1           LØYPE 1
整合最新OP评论中的规范:

exercises = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
max_reps = 3

training_days = ["Treningsdag 1","Treningsdag 2","Treningsdag 3"]
exercises_per_day = 12

loype = exercises * max_reps #list with all exercises, starting with 'STRAIGHT-GLIDING'

d = {}
for day in training_days:
    start, end = loype[0], loype[1: exercises_per_day]
    random.shuffle(end) #starts with the same exercise, shuffle the others
    d[day] = [start, *end]
    
df = pd.DataFrame(d)

print(df)

       Treningsdag 1     Treningsdag 2     Treningsdag 3
0   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
1            LØYPE 1  STRAIGHT-GLIDING  STRAIGHT-GLIDING
2            LØYPE 3           LØYPE 3           LØYPE 1
3   STRAIGHT-GLIDING           LØYPE 3           LØYPE 3
4            LØYPE 3           LØYPE 2           LØYPE 2
5            LØYPE 2           LØYPE 2           LØYPE 1
6   STRAIGHT-GLIDING           LØYPE 2           LØYPE 2
7            LØYPE 2  STRAIGHT-GLIDING           LØYPE 2
8            LØYPE 1           LØYPE 1  STRAIGHT-GLIDING
9            LØYPE 1           LØYPE 3           LØYPE 1
10           LØYPE 2           LØYPE 1           LØYPE 3
11           LØYPE 3           LØYPE 1           LØYPE 3

只需在调用
df.transpose()
后覆盖数据帧的第一行即可

df.iloc[0] = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','STRAIGHT-GLIDING']
然而,我建议用一种完全不同的方式构建数据框架。从字典开始,向其中添加随机值,然后将其转换为数据帧。我发现这种实现方式更容易阅读

loype = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
#start with 'STRAIGHT-GLIDING' for each training day
d = {
    "Treningsdag 1":['STRAIGHT-GLIDING'],
    "Treningsdag 2":['STRAIGHT-GLIDING'],
    "Treningsdag 3":['STRAIGHT-GLIDING'],
}
#add random exercises
for n in range(10):
    for k in d:
        d[k].append(*random.sample(loype, 1))
#make a DataFrame        
df = pd.DataFrame(d)

print(df)

       Treningsdag 1     Treningsdag 2     Treningsdag 3
0   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
1            LØYPE 3           LØYPE 2           LØYPE 2
2            LØYPE 3  STRAIGHT-GLIDING           LØYPE 3
3            LØYPE 2  STRAIGHT-GLIDING  STRAIGHT-GLIDING
4            LØYPE 2  STRAIGHT-GLIDING           LØYPE 3
5            LØYPE 3           LØYPE 3           LØYPE 3
6            LØYPE 2           LØYPE 3           LØYPE 2
7            LØYPE 3           LØYPE 3           LØYPE 3
8            LØYPE 2  STRAIGHT-GLIDING           LØYPE 2
9            LØYPE 3           LØYPE 1           LØYPE 2
10           LØYPE 2           LØYPE 1           LØYPE 1
整合最新OP评论中的规范:

exercises = ['STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 2', 'LØYPE 3']
max_reps = 3

training_days = ["Treningsdag 1","Treningsdag 2","Treningsdag 3"]
exercises_per_day = 12

loype = exercises * max_reps #list with all exercises, starting with 'STRAIGHT-GLIDING'

d = {}
for day in training_days:
    start, end = loype[0], loype[1: exercises_per_day]
    random.shuffle(end) #starts with the same exercise, shuffle the others
    d[day] = [start, *end]
    
df = pd.DataFrame(d)

print(df)

       Treningsdag 1     Treningsdag 2     Treningsdag 3
0   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
1            LØYPE 1  STRAIGHT-GLIDING  STRAIGHT-GLIDING
2            LØYPE 3           LØYPE 3           LØYPE 1
3   STRAIGHT-GLIDING           LØYPE 3           LØYPE 3
4            LØYPE 3           LØYPE 2           LØYPE 2
5            LØYPE 2           LØYPE 2           LØYPE 1
6   STRAIGHT-GLIDING           LØYPE 2           LØYPE 2
7            LØYPE 2  STRAIGHT-GLIDING           LØYPE 2
8            LØYPE 1           LØYPE 1  STRAIGHT-GLIDING
9            LØYPE 1           LØYPE 3           LØYPE 1
10           LØYPE 2           LØYPE 1           LØYPE 3
11           LØYPE 3           LØYPE 1           LØYPE 3

如果您希望在开始时添加它,那么您应该首先手动添加它

loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + random.sample(loype, len(loype)))
顺便说一句:如果你想要所有的元素,但在随机顺序,那么你可以使用洗牌

loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
random.shuffle(loype)
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)

最小工作代码

import pandas as pd
import random

dn = []
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']

for _ in range(3):
    random.shuffle(loype)
    dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)

df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})

print(df)
结果

       Treningsdag 1     Treningsdag 2     Treningsdag 3
0   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
1   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
2            LØYPE 1           LØYPE 3           LØYPE 2
3            LØYPE 2           LØYPE 1           LØYPE 1
4            LØYPE 2           LØYPE 3           LØYPE 2
5            LØYPE 1           LØYPE 2           LØYPE 3
6            LØYPE 1           LØYPE 3           LØYPE 3
7            LØYPE 3           LØYPE 1           LØYPE 1
8            LØYPE 3           LØYPE 1           LØYPE 3
9            LØYPE 3           LØYPE 2           LØYPE 2
10           LØYPE 2           LØYPE 2           LØYPE 1

如果您希望在开始时添加它,那么您应该首先手动添加它

loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + random.sample(loype, len(loype)))
顺便说一句:如果你想要所有的元素,但在随机顺序,那么你可以使用洗牌

loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
random.shuffle(loype)
dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)

最小工作代码

import pandas as pd
import random

dn = []
loype = ['LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']

for _ in range(3):
    random.shuffle(loype)
    dn.append(['STRAIGHT-GLIDING','STRAIGHT-GLIDING'] + loype)

df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})

print(df)
结果

       Treningsdag 1     Treningsdag 2     Treningsdag 3
0   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
1   STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
2            LØYPE 1           LØYPE 3           LØYPE 2
3            LØYPE 2           LØYPE 1           LØYPE 1
4            LØYPE 2           LØYPE 3           LØYPE 2
5            LØYPE 1           LØYPE 2           LØYPE 3
6            LØYPE 1           LØYPE 3           LØYPE 3
7            LØYPE 3           LØYPE 1           LØYPE 1
8            LØYPE 3           LØYPE 1           LØYPE 3
9            LØYPE 3           LØYPE 2           LØYPE 2
10           LØYPE 2           LØYPE 2           LØYPE 1

通过使用带有自定义键的
sorted
apply()
传递序列

import random
dn = []
for i in range(1, 4):
    df = pd.DataFrame()
    loype = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
    dn.append(random.sample(loype, len(loype)))
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
df = df.apply(lambda s: sorted(s,key=lambda x: "A" if x=="STRAIGHT-GLIDING" else x))
print(df.to_string(index=False))
输出

    Treningsdag 1     Treningsdag 2     Treningsdag 3
 STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
 STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
          LØYPE 1           LØYPE 1           LØYPE 1
          LØYPE 1           LØYPE 1           LØYPE 1
          LØYPE 1           LØYPE 1           LØYPE 1
          LØYPE 2           LØYPE 2           LØYPE 2
          LØYPE 2           LØYPE 2           LØYPE 2
          LØYPE 2           LØYPE 2           LØYPE 2
          LØYPE 3           LØYPE 3           LØYPE 3
          LØYPE 3           LØYPE 3           LØYPE 3
          LØYPE 3           LØYPE 3           LØYPE 3

通过使用带有自定义键的
sorted
apply()
传递序列

import random
dn = []
for i in range(1, 4):
    df = pd.DataFrame()
    loype = ['STRAIGHT-GLIDING','STRAIGHT-GLIDING','LØYPE 1', 'LØYPE 1', 'LØYPE 1', 'LØYPE 2', 'LØYPE 2', 'LØYPE 2', 'LØYPE 3', 'LØYPE 3', 'LØYPE 3']
    dn.append(random.sample(loype, len(loype)))
df = pd.DataFrame(dn).transpose()
df = df.rename(columns={0: "Treningsdag 1", 1: "Treningsdag 2", 2: "Treningsdag 3"})
df = df.apply(lambda s: sorted(s,key=lambda x: "A" if x=="STRAIGHT-GLIDING" else x))
print(df.to_string(index=False))
输出

    Treningsdag 1     Treningsdag 2     Treningsdag 3
 STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
 STRAIGHT-GLIDING  STRAIGHT-GLIDING  STRAIGHT-GLIDING
          LØYPE 1           LØYPE 1           LØYPE 1
          LØYPE 1           LØYPE 1           LØYPE 1
          LØYPE 1           LØYPE 1           LØYPE 1
          LØYPE 2           LØYPE 2           LØYPE 2
          LØYPE 2           LØYPE 2           LØYPE 2
          LØYPE 2           LØYPE 2           LØYPE 2
          LØYPE 3           LØYPE 3           LØYPE 3
          LØYPE 3           LØYPE 3           LØYPE 3
          LØYPE 3           LØYPE 3           LØYPE 3


我不明白你想做什么。最好显示一些示例数据和您期望的结果。如果您不使用它,为什么您要在
for
-loop的
内部创建
数据框
?也许您应该在
for
-loop-
dn=['stright-GLIDING']
之前添加
直接滑动
,然后它将是列表中的第一个。我不明白您想做什么。最好显示一些示例数据和您期望的结果。如果您不使用它,为什么要在
for
-loop的
内部创建
数据框
?也许您应该在
for
-loop-
dn=['stright-GLIDING']
之前添加
直线滑动
,然后它将是列表中的第一个。完美。更具可读性。唯一的问题是,我每门课最多只能跑3次。@ChristianMagelssen你说的3次是什么意思?最多3个?是的。因此,总共12次跑步(每门课程3次)。直线滑行算作一次滑行course@ChristianMagelssen我已相应地修改了答案。如果您需要代码中的其他注释,请告诉我。这对我来说似乎是不言自明的。你可以进一步概括
training\u days
,如果你想拥有数百天的话,只需为它设置一个范围
training\u days=range(1100,1)
,并使用f字符串生成字典的键
d[f'Treningsdag{day}]=[start,*end]
。这取决于你,太好了。更具可读性。唯一的问题是,我每门课最多只能跑3次。@ChristianMagelssen你说的3次是什么意思?最多3个?是的。因此,总共12次跑步(每门课程3次)。直线滑行算作一次滑行course@ChristianMagelssen我已相应地修改了答案。如果您需要代码中的其他注释,请告诉我。这对我来说似乎是不言自明的。你可以进一步概括
training\u days
,如果你想拥有数百天的话,只需为它设置一个范围
training\u days=range(1100,1)
,并使用f字符串生成字典的键
d[f'Treningsdag{day}]=[start,*end]
。那由你决定。谢谢。这真的很有用。我在shuffle方法中发现的唯一问题是它不返回任何东西;它只是更改了列表,这意味着如果我将其分配给变量,它将返回null。但是您的解决方案与示例方法配合得非常好。
shuffle
chages原始列表(它在适当的位置工作)
)-但在大多数情况下,它不会产生问题。但如果您想保留原始列表,则可以执行
new\u list=loype.copy()
谢谢。通过阅读代码,我意识到另一件事是可以为.append()方法提供多个对象。我认为只有使用.insert()方法才能做到这一点,这是这两种方法之间的主要区别。但在这里,您传递了两个列表,但它起作用了。首先,我使用
+
将两个列表合并为一个列表,然后我使用
append()
将这一个列表添加到
dn
——因此
append()
只添加一个对象,如
insert()
append()
insert()
之间唯一的区别是
append()
始终在末尾插入。谢谢。这真的很有用。我在shuffle方法中发现的唯一问题是它不返回任何东西;它只是更改了列表,这意味着如果我将其分配给变量,它将返回null。但是您的解决方案与示例方法配合得非常好。
shuffle
chages原始列表(它在适当的位置工作)
)-但在大多数情况下,它不会产生问题。但如果您想保留原始列表,则可以执行
new\u list=loype.copy()
谢谢。通过阅读代码,我意识到另一件事是可以为.append()方法提供多个对象。我认为只有使用.insert()方法才能做到这一点,这是这两种方法之间的主要区别。但在这里,您传递了两个列表,但它起作用了。首先,我使用
+
将两个列表合并到一个列表中,然后