从 table 列中提取数据并在 Python 中创建变量
Extract data from table column and make variables in Python
我有一个数据集,我想在每次 'Recording' 数字变化时创建一个新变量。我希望新变量包含特定 'Recording' 的 'Duration' 数据和之前的数据。所以对于下面的 table 它将是:
Var1 = (3, 3, 3)
变量 2 = (3, 3, 3, 4, 6)
Var2 = (3, 3, 3, 4, 6, 4, 3, 1, 4)
等等。我有几个数据集,它们可以有不同数量的记录(但总是从 1 开始)和每个记录的不同持续时间。非常感谢任何帮助。
Recording
Duration
1
3
1
3
1
3
2
4
2
6
3
4
3
3
3
1
3
4
您可以聚合 list
与列表的累积和,然后转换为元组和字典:
d = df.groupby('Recording')['Duration'].agg(list).cumsum().apply(tuple).to_dict()
print (d)
{1: (3, 3, 3), 2: (3, 3, 3, 4, 6), 3: (3, 3, 3, 4, 6, 4, 3, 1, 4)}
print (d[1])
print (d[2])
print (d[3])
您的输出是可能的,但不推荐:
s = df.groupby('Recording')['Duration'].agg(list).cumsum().apply(tuple)
for k, v in s.items():
globals()[f'Var{k}'] = v
@jezrael 的回答很漂亮,而且肯定更好 :)。但是如果你真的想把它作为一个循环来做,(也许将来你可能想进一步修改逻辑),那么你可能:
import pandas as pd
df = pd.DataFrame({
"Recording": [1,1,1,2,2,3,3,3,3],
"Duration": [3,3,3,4,6,4,3,1,4]
}) # your example data
records = {}
record = []
last_recording = None # flag to track change in recording
for r, d in zip(df.Recording, df.Duration):
if record and not r == last_recording:
records[last_recording] = (tuple(record))
record.append(d)
last_recording = r
records[last_recording] = (tuple(record)) # capture final group
print(records)
修改以提供字典(这似乎是明智的)。这对于大型数据集来说会很慢。
我有一个数据集,我想在每次 'Recording' 数字变化时创建一个新变量。我希望新变量包含特定 'Recording' 的 'Duration' 数据和之前的数据。所以对于下面的 table 它将是:
Var1 = (3, 3, 3)
变量 2 = (3, 3, 3, 4, 6)
Var2 = (3, 3, 3, 4, 6, 4, 3, 1, 4)
等等。我有几个数据集,它们可以有不同数量的记录(但总是从 1 开始)和每个记录的不同持续时间。非常感谢任何帮助。
Recording | Duration |
---|---|
1 | 3 |
1 | 3 |
1 | 3 |
2 | 4 |
2 | 6 |
3 | 4 |
3 | 3 |
3 | 1 |
3 | 4 |
您可以聚合 list
与列表的累积和,然后转换为元组和字典:
d = df.groupby('Recording')['Duration'].agg(list).cumsum().apply(tuple).to_dict()
print (d)
{1: (3, 3, 3), 2: (3, 3, 3, 4, 6), 3: (3, 3, 3, 4, 6, 4, 3, 1, 4)}
print (d[1])
print (d[2])
print (d[3])
您的输出是可能的,但不推荐:
s = df.groupby('Recording')['Duration'].agg(list).cumsum().apply(tuple)
for k, v in s.items():
globals()[f'Var{k}'] = v
@jezrael 的回答很漂亮,而且肯定更好 :)。但是如果你真的想把它作为一个循环来做,(也许将来你可能想进一步修改逻辑),那么你可能:
import pandas as pd
df = pd.DataFrame({
"Recording": [1,1,1,2,2,3,3,3,3],
"Duration": [3,3,3,4,6,4,3,1,4]
}) # your example data
records = {}
record = []
last_recording = None # flag to track change in recording
for r, d in zip(df.Recording, df.Duration):
if record and not r == last_recording:
records[last_recording] = (tuple(record))
record.append(d)
last_recording = r
records[last_recording] = (tuple(record)) # capture final group
print(records)
修改以提供字典(这似乎是明智的)。这对于大型数据集来说会很慢。